“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”有啥好处?的主要内容,如果未能解决你的问题,请参考以下文章

数据类型

SpringMVC介绍之约定优于配置

Control Registers(CR0, CR1, CR2, CR3, and CR4)

优于别人,并不高贵,真正的高贵,是优于过去的自己

为啥 InvokeRequired 优于 WindowsFormsSynchronizationContext?

CR, LF, CR/LF 回车 换行