“Declare @TableName”优于“Create Table TableName”有啥好处?
Posted
技术标签:
【中文标题】“Declare @TableName”优于“Create Table TableName”有啥好处?【英文标题】:What is the benefits of "Declare @TableName" over "Create Table TableName"?“Declare @TableName”优于“Create Table TableName”有什么好处? 【发布时间】:2015-10-21 16:53:11 【问题描述】:我在工作中分配了一项提高绩效的任务。 我们正在运行 SQL Server 2012。数据库有许多具有数百万行的表,报告需要 30 多分钟才能查看结果。
运行包含执行计划的存储过程表明,在“声明@T 表”以及插入和从中选择期间消耗了大约 98%。经过几个小时的试验和错误,我将这部分更改为“创建表 T”,并将创建的表放在 Proc 的末尾。
结果很迷人。现在只需不到 10 分钟即可检索数据。 任何人都可以解释为什么会发生这种情况?
我不知道我是否需要继续使用这种方法,或者我还有其他事情需要注意。
【问题讨论】:
【参考方案1】:百分比只是估计值,基于行数估计值 - 这可能是您的问题。表变量没有统计信息,因此大多数情况下 SQL Server 估计表中有 1 行。
如果您在连接或类似的情况下使用这些表变量,则查询计划可能非常糟糕,因为对行数的估计错误。
如果没有理由使用表变量,您应该首先尝试使用正常温度。表(#tableName)。如果这些表中有很多行,创建索引也可能是个好主意。
比较查询计划,估计行数和统计信息输出应该让您大致了解执行之间的区别。不要太相信百分比,这可能是完全错误的,但统计信息 io 是可以信任的(除非你也在那里使用多语句 UDF)
【讨论】:
以上是关于“Declare @TableName”优于“Create Table TableName”有啥好处?的主要内容,如果未能解决你的问题,请参考以下文章
Control Registers(CR0, CR1, CR2, CR3, and CR4)