求教下,聚集索引和无索引下,为什么扫描计数不一样?

Scorpius246 2016-06-15 03:30:34

select * from tablea where id in (2,3,4);

select * from tablea where id between 2 and 4;
1. 当 id 是 tablea 聚集索引列的时候。 为什么用in 要查找聚集索引3次,而用between and 只要查找聚集索引1次
(3 行受影响)
表 'tablea'。扫描计数 3,逻辑读取 6 次,物理读取 0 次,预读 0 次,lob 逻辑读取 0 次,lob 物理读取 0 次,lob 预读 0 次。

(3 行受影响)
表 'tablea'。扫描计数 1,逻辑读取 2 次,物理读取 0 次,预读 0 次,lob 逻辑读取 0 次,lob 物理读取 0 次,lob 预读 0 次。

2. 当 tablea无索引时。 为什么用in 和 between and 只要扫描表就完成了?

(3 行受影响)
表 'tablea'。扫描计数 1,逻辑读取 1 次,物理读取 0 次,预读 0 次,lob 逻辑读取 0 次,lob 物理读取 0 次,lob 预读 0 次。

(3 行受影响)
表 'tablea'。扫描计数 1,逻辑读取 1 次,物理读取 0 次,预读 0 次,lob 逻辑读取 0 次,lob 物理读取 0 次,lob 预读 0 次。
...全文
250 7 打赏 收藏 转发到动态 举报
写回复
用AI写文章
7 条回复
切换为时间正序
请发表友善的回复…
发表回复
a7747369 2016-06-16
  • 打赏
  • 举报
回复
sql server 索引都是按照B树结构来组织的,即所有叶到根的距离都相同的树,一次查找操作在页读取的方面的成本正好是一个索引的级数,小表,索引大多是2级 ----有索引 由于你的 IN(2,3,4)需要分别查找,所以扫描了表3次,每一次逻辑读取次数为2,所以结果是表扫描3次,逻辑读取次数6次 ------无索引 1.如果没有索引,走的是表扫描,即连续地扫描表中的所有数据页,即使你只取第一条数据,他也会扫描全部数据页,由于是读取所有数据页的数据,所以他只需要扫描一次表,逻辑读取次数则是数据页的数量,所以你的IN(2,3,4)的表扫描次数为1次,逻辑读取次数1次
转身@未来 2016-06-16
  • 打赏
  • 举报
回复
有索引与无索引当然不一样了,没索引就像一推乱摆放的书,找你想要的书时需要逐个去翻,但是有索引,就好比按照一定顺序摆放整齐的书,需要时直接可以找到,不需要逐个去翻。
misterliwei 2016-06-16
  • 打赏
  • 举报
回复
引用 2 楼 qq_14931865 的回复:
[quote=引用 1 楼 ap0405140 的回复:] 执行计划中, 读取次数的最小单位是数据页(1个数据页大小为8kb), 当3条记录在同一个数据页时,读取次数为1.
你好版主,读取次数能理解,为什么扫描次数不一样呢[/quote] 虽然两个语句都是索引查找,但是具体实现是不同的。 1)IN (2,3,4) 需要分别进行查找,所以共3次扫描。 2)BETWEEN 2 AND 4 只需一次查找定位到2后,然后向一个方向扫描即可。
starseeker7 2016-06-15
  • 打赏
  • 举报
回复
select * from tablea where id in (2,3,4); 类似 select * from tablea where id =2 union all select * from tablea where id =3 union all select * from tablea where id =4 而between可以走索引 当然以上只是猜测 毕竟执行计划不是必然的 除非你给出具体表结构,和数据填充,这样看执行计划才知道数据到底干了什么
足球不是方的 2016-06-15
  • 打赏
  • 举报
回复
只知道,in转化成or,between转换成>=。有无索引对这2中方式的影响,度娘了下,都没说清楚,等高人来解惑
Scorpius246 2016-06-15
  • 打赏
  • 举报
回复
引用 1 楼 ap0405140 的回复:
执行计划中, 读取次数的最小单位是数据页(1个数据页大小为8kb), 当3条记录在同一个数据页时,读取次数为1.
你好版主,读取次数能理解,为什么扫描次数不一样呢
唐诗三百首 2016-06-15
  • 打赏
  • 举报
回复
执行计划中, 读取次数的最小单位是数据页(1个数据页大小为8kb), 当3条记录在同一个数据页时,读取次数为1.

34,594

社区成员

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

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