05.索引-非聚集索引(1)-聚集表

建立非聚集索引
 
CREATE NONCLUSTERED INDEX NCIX_Employee001_Department_Organization ON Employee001(Department,Organization);
ALTER INDEX NCIX_Employee001_Department_Organization ON Employee001 REORGANIZE
 
索引情况
SELECT
database_id,
index_id,
index_type_desc,
index_depth,
index_level,
page_count
FROM sys.dm_db_index_physical_stats(DB_ID('IndexDB'),OBJECT_ID('Employee001'),null,null,null)
 
 
变成了两个索引
其中 聚集索引页数量为 1615,其实就是数据页的数量
非聚集索引的数量为 1244
 
重新查询DBCC Ind
 
TRUNCATE TABLE DBCCIndResult
INSERT INTO DBCCIndResult EXEC('DBCC IND(IndexDB,Employee001,-1)')
 
 
分析结果
 
SELECT *
FROM DBCCIndResult
WHERE PageType=2
AND IndexID =1
 
 
 
之前建立的聚集索引页没有任何变化 依旧是 1+16=17个
 
 
SELECT *
FROM DBCCIndResult
WHERE PageType=2
AND IndexID =3
 
 
 
 
同时,增加了一些IndexId=3的页,就是刚刚建立的非聚集索引页
 
非聚集索引的IndexLevel =2 的数量为 1  IndexLevel=1 的数量为 18 IndexLevel=0 的页数量为 1244
1+18+1244=1263
注意 跟聚集索引不同的是 聚集索引 IndexLevel=0的是数据页 而非聚集索引却是索引页
 
从根节点开始看
找到根
SELECT *
FROM DBCCIndResult
WHERE PageType=2
AND IndexID =3
AND IndexLevel=2
--结果 250
 
查看
DBCC TRACEON(3604)
DBCC PAGE (IndexDB, 1, 250, 3);
 
IndexLevel =1 的页有18个
 
 
 
 
 
 
接着查看 IndexLevel =1 的索引页
 
 
 
接着查看IndexLevel=0的页(索引页!!!)
 
 
 
注意到 每个非聚集索引页中都有一个Id (Key)列
 
在非聚集索引的叶子层,每个索引行包含非聚集索引键值(KeyHashValue)和行定位器。这个定位器指向聚集索引或堆表的数据行。
根据这个定位器可以定位到一行数据。
 
如果聚集表,存在聚集索引,则聚集索引,即图中的Id(Key) 作为定位器。
 
如果是堆表,它没有聚集索引,行定位器是个指向行的指针。这个指针由页里行的(文件号:页号:槽号,file identifier :page number :slot number)组成
 
 
行定位器主要用于查找不在非聚集索引键列定义中的列时,需要定位到行中将数据读取出来。
这时候会先定位到需要的非聚集索引,然后根据行定位器找到数据(RID lOOKuP OR Key Lookup)
 
后续会再介绍。
 
 
 
 
接下来 看非聚集索引的查找过程:
 
SET STATISTICS IO ON
SELECT Department From Employee001
WHERE Department= 'Dep7'
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
可以看到使用了索引(非聚集索引)查找
 
 
 
 
原文地址:https://www.cnblogs.com/ywnwa417/p/6035252.html