SQL Server性能优化(10)非聚集索引的存储结构

时间:2022-02-06 08:59:33

一,新建测试表

CREATE TABLE [dbo].[Users]( 
    [ID] [int] IDENTITY(1,1) NOT NULL, 
    [NAME] [char](80) NOT NULL, 
    [CreatTime] [datetime] NOT NULL 
) ON [PRIMARY] 

删除默认聚集索引,新建一个在name列上非聚集索引

插入500条数据

查看该表的页的信息

---开启跟踪标志 
DBCC TRACEON(3604,2588) 
--DBCC TRACEOFF(3604,2588) 
---获取对象的数据页,结构:数据库、对象、显示 
DBCC IND(Ixtest,users,-1)

SQL Server性能优化(10)非聚集索引的存储结构

二、查看非聚集索引的根页面

DBCC page(IxTest,1,202,3)

SQL Server性能优化(10)非聚集索引的存储结构

1. 索引根页面有五个子页面,为201~206。根据上一个图,这5个子页面Type都是2,也是索引页面,即B+树的中间节点(而不是页节点)的页面。

2. 这五个子页面,每个页包含80行数据(258-179=79,337-258=179),并且是对Name列进行划分,因为该表现在只有一个索引是Name列。

3. 倒数第二列是行定位指针,包括三部分:文件标识符(ID)+页码+页上的行数。

如何进行分析?参考文档里说:

举例第二行0x 4F000000 0100 1200除去开头的16进制标示,剩下总共8个字节,从右往左行号2个字节,文件ID2个字节,最左侧的4个字节就是页号了,所以

行号(0012)=18

文件页(0001 )=1

页号(0000004F)=59页

总结下就是,202页是非聚集索引的根页,它第二行是“张三179”,这一行指向是一个子索引页(页号201)。这个子索引页内共有80行,每一行指向1条数据。并且这80条数据的第一条的位置在1号文件里59页的18行。

二、查看非聚集索引的子索引页面

DBCC page(IxTest,1,201,3)

SQL Server性能优化(10)非聚集索引的存储结构

看下按照非聚集索引的查询计划

SET STATISTICS IO ON 
SELECT * FROM Users WHERE NAME = '张三180'  

SQL Server性能优化(10)非聚集索引的存储结构

总结下,非聚集索引的查询过程 (如Name = ‘张三180’)

1. 首先查找根索引页,根索引页会找自己所有的子索引,看看那个子索引包含“张三180”。这是第一次读取物理页。

2. 找到这个子索引页,在子索引页的页内,找到“张三180”所在的行。然后看到其RID的信息。这是第二次读取物理页

3. 从硬盘读取这个页,这是第三次读取物理页

SQL Server性能优化(10)非聚集索引的存储结构

参考

http://www.cnblogs.com/chenmh/p/4365854.html