查询计划显示的54%成本插入时,没有行实际参与
问题描述:
在我的查询中的一个有数据的insert
到一个临时表。查看查询计划,它显示实际插入临时表占用54%(只需将数据插入临时表)。但是,没有行被插入到临时表中。查询计划显示的54%成本插入时,没有行实际参与
为什么计划显示非零值插入任何行的时候?
答
即使在实际查询计划中显示的子树成本基于估计以及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
即使当它到达行的估计数目正确的但仍然分配一个小的非零成本的插入。我猜它使用的启发式方法总是分配固定成本的一小部分。
答
的54成本并不意味着行需要参与。或许有是INSERT到临时表的WHERE子句中使用索引扫描或其他搜索操作或者是一些非最优的查找?
答
看看这个
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
,而不是来衡量绩效,这两个都好很多indicators..when看到3读取VS 10000读取你知道什么是happening..what做45%告诉你什么时候整个过程可以运行3分钟或3秒
你能够显示截图和/或SQL语句吗? – 2010-09-11 15:00:19