在工作中,我被分配了一项提高绩效的任务。我们运行的是SQL Server 2012。该数据库有许多具有数百万行的表,报告需要30分钟以上的时间才能查看结果。
在包含执行计划的情况下运行存储的Proc显示,在"Declare @T Table“和插入并从中选择期间消耗了大约98%。经过几个小时的试验和错误,我将这一部分更改为“创建表T”,并在过程结束时删除了创建的表。
结果是迷人的。现在,检索数据只需不到10分钟。谁能给我解释一下发生这种情况的原因?
我不知道我是否需要继续使用这种方法,或者还有其他事情需要我去关心。
发布于 2015-10-22 01:00:04
百分比只是估计值,它基于行计数估计值--这可能是您的问题所在。表变量没有统计信息,因此在大多数情况下,SQL Server估计表中只有1行。
如果您在joins或类似的东西中使用这些表变量,查询计划可能会因为对行数的错误估计而变得非常糟糕。
如果没有理由使用表变量,您应该首先尝试使用normal temp。表(#tableName)。如果您在这些表中有很多行,创建索引也可能是一个好主意。
通过比较查询计划、对行数的估计和统计io输出,您应该可以大致了解执行之间的区别。不要太相信百分比,这些可能是完全错误的,但是统计信息io是可以信任的(除非你也在那里使用多语句UDF)
https://stackoverflow.com/questions/33265013
复制相似问题