You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

临时表与表变量性能测试疑惑:为何临时表未显更慢?

问题

普遍认为临时表存储在磁盘,表变量存储在内存,所以写入临时表的速度应该远慢于表变量。但测试以下两段脚本后发现,二者执行时间近乎一致(甚至临时表表现略优),请问这是什么原因?

测试脚本1(临时表)

DROP TABLE #TEST

Create Table #test
(
    Id UNIQUEIDENTIFIER 
)

DECLARE @i INT = 1;

WHILE @i < 1000
     BEGIN 
        INSERT INTO #test VALUES  (NEWID())
        SET @i = @i + 1;
    END

测试脚本2(表变量)

DECLARE @table1 TABLE
(
    Id UNIQUEIDENTIFIER 
)
DECLARE @i INT = 1;

WHILE @i < 1000
     BEGIN 
        INSERT INTO @table1 VALUES  (NEWID())
        SET @i = @i + 1;
    END
原因分析
  • 存储位置的认知错误:临时表并非固定存在磁盘,表变量也不是只在内存。SQL Server的缓冲池会优先缓存小数据量的临时表和表变量,只有当数据量超过内存阈值或内存不足时,才会将数据刷到磁盘。你测试的1000条数据量极小,二者都在内存中处理,IO开销几乎一致。
  • 执行计划的差异:临时表会生成统计信息,SQL Server优化器能基于统计信息生成更精准的执行计划;表变量默认不维护统计信息,优化器对其数据量的估算可能偏保守,但在小数据量场景下,临时表的执行计划反而更高效。
  • 循环开销主导性能:你的测试采用单条循环插入,此时循环本身的变量操作、条件判断、NEWID()生成的开销,远大于插入操作本身的开销,这就掩盖了临时表和表变量在存储层面的细微差异。如果换成批量插入百万级别的数据,二者的性能差距才会显现。
  • 日志开销差距极小:临时表的事务日志写入tempdb,而tempdb默认是SIMPLE恢复模式,日志写入开销极低;表变量的操作同样会记录日志到tempdb,二者的日志开销在小数据量下可以忽略不计。

内容的提问来源于stack exchange,提问作者Sergey Dev

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.23 15:03:25