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