我最近在一个非常慢的存储过程中工作(运行了 5 分钟)。我做了一个很小的调整:
declare @tempTable table
(
...
)
insert into @tempTable
select .....
至
select ... into #tempTable from someTable
然后脚本在约 2 秒内运行。什么可以解释这个时差?
我最近在一个非常慢的存储过程中工作(运行了 5 分钟)。我做了一个很小的调整:
declare @tempTable table
(
...
)
insert into @tempTable
select .....
至
select ... into #tempTable from someTable
然后脚本在约 2 秒内运行。什么可以解释这个时差?
表变量没有与临时表相同的统计信息,通常它们被假定只有 1 行。这种对行数的错误估计将使嵌套循环操作看起来像是最好的计划,但是当对大量行执行此操作时,成本可能比表扫描更容易。
只是为了添加到@MartinC 的答案,即表变量的行数被维护
tempdb.sys.partitions
并OPTION(RECOMPILE)
可能导致它被使用,但它没有任何更细粒度的统计数据可供使用,因此需要依靠基于此的猜测。您只显示了人口代码,而不是使用它的任何代码。插入表变量的查询的另一个限制是它们不能有并行计划,因此可以解释为什么填充查询可能运行得更快。
MartinC 是正确的,而且您还可以将索引应用于临时表。这不能用表变量来完成。