首页 > 代码库 > 05.索引-非聚集索引(1)-聚集表
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‘
可以看到使用了索引(非聚集索引)查找
05.索引-非聚集索引(1)-聚集表
声明:以上内容来自用户投稿及互联网公开渠道收集整理发布,本网站不拥有所有权,未作人工编辑处理,也不承担相关法律责任,若内容有误或涉及侵权可进行投诉: 投诉/举报 工作人员会在5个工作日内联系你,一经查实,本站将立刻删除涉嫌侵权内容。