INSERT 临时表和表变量之间的性能差异

mun*_*sor 13 performance sql-server-2005 temporary-tables

我在 SQL Server 2005 中遇到以下问题:与使用临时表的相同插入相比,尝试将一些行插入表变量需要大量时间。

这是插入表变量的代码

DECLARE @Data TABLE(...)
INSERT INTO @DATA( ... )
SELECT ..
FROM ...
Run Code Online (Sandbox Code Playgroud)

这是插入临时表的代码

CREATE #Data TABLE(...)
INSERT INTO #DATA( ... )
SELECT ..
FROM ...
DROP TABLE #Data
Run Code Online (Sandbox Code Playgroud)

临时表没有任何键或索引,2次查询的select部分相同,select返回的结果数为~10000行。单独执行选择所需的时间约为 10 秒。

执行临时表版本最多需要 10 秒,我不得不在 5 分钟后停止表变量版本。

我必须使用表变量,因为查询是表值函数的一部分,不允许访问临时表。

表变量版本的执行计划 执行计划

临时表版本的执行计划 执行计划

Mar*_*ith 8

两种方案的明显区别在于,快的是并行,慢的是串行。

这是插入表变量的计划的局限性之一。正如评论中提到的(似乎它具有预期的效果)你可以尝试做

INSERT INTO @DATA ( ... ) 
EXEC('SELECT .. FROM ...')
Run Code Online (Sandbox Code Playgroud)

看看这是否绕过了限制。

  • 作为一般经验法则,如果您希望获得返回的大型数据集,则不希望使用表变量。在这种情况下,临时表通常更快。 (2认同)