统计IO (逻辑/物理读取)是否包括非叶级索引页?
下面的示例是直接从盖尔·肖的这一旧职位中删除的:
https://sqlinthewild.co.za/index.php/2009/03/05/when-is-a-seek-actually-a-scan/
--Setup
CREATE TABLE TestingSeeks (
id int identity (1,1) not null,
SomeStr char(6) default '' -- a filler
)
insert into TestingSeeks (SomeStr)
select top (500000) ''
from sys.columns c1 cross join sys.columns c2
CREATE NONCLUSTERED INDEX idx_Seek ON TestingSeeks (id)
--Example queries
--Query 1
select id
from TestingSeeks
--Query 2
select id
from TestingSeeks
where id > 0-查询1的统计IO输出
(500000排(S)受影响)表“测试西克斯”。扫描计数1,逻辑读取1120,-所有其他列为零。
-查询2的统计IO输出
(500000排(S)受影响)表“测试西克斯”。扫描计数1,逻辑读取1120,-所有其他列为零。
正如您所看到的,对于两个查询(查找和扫描),逻辑读取都是相同的,但是我认为搜索将有更多的页面可读取,因为它将从索引的中间层(S)读取根页和页。
如果我运行以下查询:
--Seek for one row
--Query 3
select id
from TestingSeeks
where id = 400-查询3的统计IO输出
(1排(S)受影响)表“试用表”。扫描计数1,逻辑读3,-所有其他列为零。
您可以看到有三次读取(1.根页,2.中间页,3.叶级页),那么为什么上面查询2的统计数据不包括比扫描多两行(查询1)?
Server @@Version: Microsoft 2014 (SP2-GDR) (KB4057120) - 12.0.5214.6 (X64) 2018年1月9日15:03:12版权(c) Edition (64位) on Windows 6.1 (Build 7601: Service Pack 1)
发布于 2018-09-04 11:32:48
是的,逻辑读取包括非叶级索引页。
对于第一个查询中的索引扫描,第一个逻辑页的位置是遍历b树以找到第一个索引叶页,然后按照逻辑顺序扫描整个索引。这些统计数据包括2个非叶页和所有索引叶页。
对于第二个查询中的索引查找,第一个符合条件的逻辑页通过遍历b树,然后扫描叶页来定位。这些统计数据包括相同的2页非叶页,定位第一页所需的全部扫描(假设在键值0之前或在第一页中不存在行)。相同数量的叶页会被触及,因为所有页面都符合搜索谓词的条件。
第三个查询中的相等谓词与前两个查询的b-树层次结构中的非叶页的数量相同,尽管可能不同的非根页,但是只需要一个叶页来满足谓词,总共有3个逻辑的IOs。
https://dba.stackexchange.com/questions/216638
复制相似问题