在我的一个查询中,临时表中有insert
个数据。查看查询计划,它显示临时表中的实际插入占用了54%(只是将数据插入临时表)。但是,没有行插入临时表。
为什么在没有插入行时计划显示非零值?
答案 0 :(得分:3)
即使在实际查询计划中,显示的子树成本也是基于估算值以及various heuristics and magic numbers used by the cost based optimiser。它们可以是woefully wrong,应该用大量的盐来摄取。
重现的例子
create table #t
(
i int
)
insert into #t
select number
from master.dbo.spt_values
where number = 99999999
实际插入是零行,但估计是1行,这是子树成本的来源。
修改:我刚试过以下内容
insert into #t
select top 0 number
from master.dbo.spt_values
where number = 99999999
即使它获得了正确的行数,它仍然会为插入分配一个小的非零成本。我猜它使用的启发式总是分配一些固定成本的小元素。
答案 1 :(得分:3)
看看这个
insert into #temp
select * from sometable
where left(Somecol,3) = 'BLA'
不是sargable
所以它会导致扫描,但如果没有找到行,则不会发生插入...扫描仍然发生
但如果你这样做,那么成本应该会急剧下降,因为现在可以使用索引
insert into #temp
select * from sometable
where Somecol like 'BLA%'
BTW我会用STATISTICS TIME
和STATISTICS IO
来衡量表现,这两个是更好的指标..当你看到3次读数与10000次读数时,你知道发生了什么...... 45%是什么告诉你整个过程何时可以运行3分钟或3秒
答案 2 :(得分:0)
54的成本并不意味着需要涉及行。也许在INSERT的WHERE子句中有一个索引扫描或其他查找操作或者可能是一些非最佳查找到临时表?