日期:2014-05-17  浏览次数:20692 次

好奇怪!sql查询求解
大家好

今天我碰到个SQL查询问题
SQL查询语句如下:

Select  top 1
Inv_id=A.Inv_id               
From Inv A  
Inner Join Loc loc on A.Loc_id=loc.Loc_id
Where loc.Wh_id=-1581427986821640114 And A.Inv_status='-10'

执行计划如下:


发现速度好慢,查询耗时需要几分钟
尝试加了非聚簇索引(Loc_id,Inv_status)后,耗时只需几秒

然后我修改了SQL语句,将Top 1去除,变成

Select -- top 1
Inv_id=A.Inv_id               
From Inv A  
Inner Join Loc loc on A.Loc_id=loc.Loc_id
Where loc.Wh_id=-1581427986821640114 And A.Inv_status='-10'

此时执行计划如下:

但是查询耗时也只有几秒

请教为什么前面有无‘Top 1’语句
查询效率会差那么多

谢谢!
sql

------解决方案--------------------
引用:
Quote: 引用:

这个与是否用top 1没有多大关系,虽然用了top 1,但是符合条件的记录可能在表靠后扫描的记录,这样也会用很长时间。真正起作用的是你加了索引

写的不是很清楚
去掉‘Top 1’语句时查询时
非聚簇索引(Loc_id,Inv_status)是没有的

也就是在相同条件下
有无'Top 1'语句 做的测试

loc.Wh_id字段应该有索引。
#1.在有TOP 1时,用的是嵌套循环,由于只返回一条,且不用排序,按道理应该很快返回。
#2.在无TOP 1时,用的是哈希匹配,由于要返回所有匹配上的记录,按道理应该返回较慢。
便根据楼主描述的意思,#1慢,#2快。那就是数据分布的问题了:两个表,数据量都比较大,且符合条件的记录都比较靠后,导致了虽然是TOP 1,却进行了多次的嵌套循环(每次查询都是扫描),比哈希还慢。
楼主执行SQL前打开这个开关:SET STATISTICS IO,TIME ON 应该会发现,#1中的逻辑IO数比#2多了很多。
如果我上面说的不对,请及时反馈。