我在一起UNIONISING两个SQL Server密集查询。
我对SQL很新,所以我使用多个视图来准备数据。
VIEW 1 VIEW A
| |
VIEW 2 (Grouping View 1) VIEW B (Grouping View A)
\ /
UNION VIEWS 2B (JOINING VIEW 2 AND B)
|
VIEW 3 (Grouping View 2B) ANOTHER VIEW C
\ /
UNION VIEW 3C (JOINING VIEW 3 AND C)
当我到View 3C时,大约有400万行数据和52列。当我从SQL Server Management Studio运行View时,有时会出现“TIME EXPIRED ERROR”。有时它运行得很好,但开始输出数据大约需要10分钟。
如果我将查询运行到Excel中的数据透视表中,它有时会运行,有时会崩溃。
数据每周星期三更新,大约有30人刷新数据。
所以我再次成为SQL新手,想知道可以提出的不同方法。是否有可以提供帮助的中间视频集?
答案 0 :(得分:1)
我投票决定将此问题作为主要基于意见的结果,我想解释原因。这个评论太长了。
首先,它是基于意见的,因为您没有提供正在运行的代码或解释问题。你是在征求一般意见。您应该使用代码示例提出另一个问题并描述您想要做的事情。
使用临时表与更复杂的查询是一个观点问题,并且双向都有好处和缺点。 SQL Server有一个非常好的优化器,所以它通常可以很好地优化复杂的查询。它还支持查询提示(Postgres,你在听吗?)。根据我的经验,SQL Server优化器偶尔提供查询提示已足以实现性能。
另一方面,有些人更习惯使用临时表。并且,当它们不被用作拐杖时,它们肯定会有所帮助。例如,您可以在临时表上构建索引,这可以极大地提高性能。此外,如果您在查询中多次使用子查询,则SQL Server会重新创建它们,而不是存储结果并重新使用结果(Microsoft,您在监听吗?)。例如,甚至没有编译器提示来实现CTE。
我发现使用临时表会导致代码复杂化。它需要为表分配名称,并确保在重新运行查询时正确更新它们。多年来,我花了很多时间来调试由于中间表没有正确更新而引起的问题(这是我不倾向于使用它们的主要原因)。
最后,我不认为观点是正确的方法。 SQL引擎在第一次运行时编译视图。如果数据发生变化,那么执行计划可能不会改变 - 然后查询计划就不是最理想的了。当底层数据可能以可能影响查询计划的方式发生变化时,您需要小心查看(以及存储过程和函数中的查询)。
我自由地承认这种解释是基于意见的,其他人可能对这个问题有不同的看法。但是,如果您不熟悉SQL,那么您的查询可能并不复杂,您应该获得更复杂查询的经验。