"声明@ TableName"有什么好处?结束"创建表TableName"?

时间:2015-10-21 16:53:12

标签: sql sql-server database sql-server-2012 sqlperformance

在工作中为我分配了一项性能增强任务。 我们正在运行SQL Server 2012.数据库有许多包含数百万行的表,报告需要超过30分钟才能查看结果。

运行存储过程并包含执行计划显示在"声明@T表"期间消耗了大约98%并插入和选择它。经过几个小时的试验和错误后,我将这部分改为"创建表T"并将创建的表放在Proc。

的末尾

结果很迷人。现在,检索数据所需的时间不到10分钟。 任何人都可以解释为什么会发生这种情况的原因?

我不知道是否需要继续使用这种方法,或者我还有其他一些需要注意的事项。

1 个答案:

答案 0 :(得分:1)

百分比只是基于行数估算的估算值 - 这可能是您的问题。表变量没有统计信息,因此在大多数情况下,SQL Server估计表中有1行。

如果你在连接或类似的东西中使用那些表变量,那么查询计划可能非常糟糕,因为对行数的估计错误。

如果没有理由使用表变量,则应首先尝试使用普通临时值。表(#tableName)。如果这些表中有很多行,那么创建索引也可能是一个好主意。

比较查询计划,行数估计和统计输出应该可以让您大致了解执行之间的区别。不要相信百分比那么多,那些可能是完全错误的,但统计信息可以信任(除非,你也在那里使用多语句UDF)