好奇怪!sql查询求解

oreoconansisu 2013-08-27 05:48:39
大家好

今天我碰到个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’语句
查询效率会差那么多

谢谢!
...全文
196 6 打赏 收藏 转发到动态 举报
写回复
用AI写文章
6 条回复
切换为时间正序
请发表友善的回复…
发表回复
oreoconansisu 2013-08-28
  • 打赏
  • 举报
回复
引用 5 楼 wwwwgou 的回复:
[quote=引用 3 楼 oreoconansisu 的回复:] [quote=引用 2 楼 hdhai9451 的回复:] 这个与是否用top 1没有多大关系,虽然用了top 1,但是符合条件的记录可能在表靠后扫描的记录,这样也会用很长时间。真正起作用的是你加了索引
写的不是很清楚 去掉‘Top 1’语句时查询时 非聚簇索引(Loc_id,Inv_status)是没有的 也就是在相同条件下 有无'Top 1'语句 做的测试[/quote] loc.Wh_id字段应该有索引。 #1.在有TOP 1时,用的是嵌套循环,由于只返回一条,且不用排序,按道理应该很快返回。 #2.在无TOP 1时,用的是哈希匹配,由于要返回所有匹配上的记录,按道理应该返回较慢。 便根据楼主描述的意思,#1慢,#2快。那就是数据分布的问题了:两个表,数据量都比较大,且符合条件的记录都比较靠后,导致了虽然是TOP 1,却进行了多次的嵌套循环(每次查询都是扫描),比哈希还慢。 楼主执行SQL前打开这个开关:SET STATISTICS IO,TIME ON 应该会发现,#1中的逻辑IO数比#2多了很多。 如果我上面说的不对,请及时反馈。[/quote] 对的,你说的是正确的,跟数据的分布有关 看来有时加了‘Top 1’也不一定能使效率提高,还是要具体情况具体分析了 问题解决,谢谢了
Shawn 2013-08-27
  • 打赏
  • 举报
回复
引用 3 楼 oreoconansisu 的回复:
[quote=引用 2 楼 hdhai9451 的回复:] 这个与是否用top 1没有多大关系,虽然用了top 1,但是符合条件的记录可能在表靠后扫描的记录,这样也会用很长时间。真正起作用的是你加了索引
写的不是很清楚 去掉‘Top 1’语句时查询时 非聚簇索引(Loc_id,Inv_status)是没有的 也就是在相同条件下 有无'Top 1'语句 做的测试[/quote] loc.Wh_id字段应该有索引。 #1.在有TOP 1时,用的是嵌套循环,由于只返回一条,且不用排序,按道理应该很快返回。 #2.在无TOP 1时,用的是哈希匹配,由于要返回所有匹配上的记录,按道理应该返回较慢。 便根据楼主描述的意思,#1慢,#2快。那就是数据分布的问题了:两个表,数据量都比较大,且符合条件的记录都比较靠后,导致了虽然是TOP 1,却进行了多次的嵌套循环(每次查询都是扫描),比哈希还慢。 楼主执行SQL前打开这个开关:SET STATISTICS IO,TIME ON 应该会发现,#1中的逻辑IO数比#2多了很多。 如果我上面说的不对,请及时反馈。
oreoconansisu 2013-08-27
  • 打赏
  • 举报
回复
引用 2 楼 hdhai9451 的回复:
这个与是否用top 1没有多大关系,虽然用了top 1,但是符合条件的记录可能在表靠后扫描的记录,这样也会用很长时间。真正起作用的是你加了索引
写的不是很清楚 去掉‘Top 1’语句时查询时 非聚簇索引(Loc_id,Inv_status)是没有的 也就是在相同条件下 有无'Top 1'语句 做的测试
Andy__Huang 2013-08-27
  • 打赏
  • 举报
回复
这个与是否用top 1没有多大关系,虽然用了top 1,但是符合条件的记录可能在表靠后扫描的记录,这样也会用很长时间。真正起作用的是你加了索引
oreoconansisu 2013-08-27
  • 打赏
  • 举报
回复
另外请教下 执行计划中的索引扫描和索引查找有何区别 谢谢

34,594

社区成员

发帖
与我相关
我的任务
社区描述
MS-SQL Server相关内容讨论专区
社区管理员
  • 基础类社区
  • 二月十六
  • 卖水果的net
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧