文档介绍:概述
最近要分享一个课件就重新把这块知识整理了一遍出来,篇幅有点长,想要理解的透彻还是要上机实践。
正文
聚集索引
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
--创建测试数据库
CREATE DATABASE Ixdata
GO
USE [Ixdata]
GO
---创建测试表
CREATE TABLE Orders
(ID INT PRIMARY KEY IDENTITY(1,1),
NAME CHAR(80)NOT NULL,
IDATE DATETIME NOT NULL DEFAULT(GETDATE())
);
GO
---插入1000条测试数据
DECLARE ***@ID INT=1
WHILE(***@ID<=1000)
BEGIN
INSERT INTO Orders(NAME)VALUES('商品'+CONVERT(NVARCHAR(20),***@ID))
SET ***@ID=***@ID+1
END
GO
SELECT * FROM Orders
GO
分析新创建的表的页的信息
1
2
3
4
5
6
7
8
---显示跟踪标志的状态
TRACESTATUS
 
---开启跟踪标志
TRACEON(3604,2588)
-- TRACEOFF(3604,2588)
---获取对象的数据页,结构:数据库、对象、显示
IND(Ixdata,Orders,-1)
/*
1:显示所有分页的信息,包括IAM分页,数据分页,所有存在的LOB分页和行溢出页,索引分页
-1: 显示所有IAM、数据分页、及指定对象上全部索引的索引分页.
-2: 显示指定对象的所有IAM分页
0:显示所有IAM、数据分页.
*/
IND的表结构
还可以通过另一种方法来测试:
1
2
3
4
5
6
7
select , , , , , ,first_iam_page,
 first_page, root_page
from so
inner join sp on =
inner join sa on =
inner join internals on =
where = object_id('orders')
最后三个字段分别是IAM页,根页,和第一个数据页;它们分别用16进制来表示,拿first_iam_page来分析,首先将编码从右往左一个字节接着一个字节反过来排行(0X代表16进制),结果就是0X,00 01,00 00 00 50;前两个字节代表文件组号,最后4个字节代表页号。16进制的0001转换成10进制就是1;16进制的00 00 00 50转换成10进制就是5*16的1次方=5*16=80,所以第一个数据页是4*16+15=79,根页是5*16+9=89 结果和前面的查询出来的结果是一样的。从表格的otal_pages,used_pages,data_pages得到的结果也和前面查询出来的结果是一致的,总分配了17个页,使用了15个页包括13个数据页+1个IAM页+1个索引页。
手绘一张当前表格的聚集索引体系结构图:
分析索引页
1
2
--- page的格式为(数据库,文件id,页号,显示)
page(Ixdata,1,89,3)
分析结果89页下面的子页总共有13页,每页80条记录,89索引页记录了每页的的键值的最小值,第一页就是id为1-80,第二页81-160,所以当你要找ID为150的数据的时候直接就可以去第90页里面找了。
PAGE HEADER
分析数据页
通过这些数据我们基本上可以知道90页的基本情况了,包括它的字段长度,上一页、下一页,还有该页的所以记录(这里没有截图出来).
插入20万条记录分析索引结构 
1
2
3
4
5
6
7
8
9
10
11
12
13
14