zoukankan      html  css  js  c++  java
  • 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'
     
     
     
     
     
     
     
     
     
     
     
     
     
     
     
    可以看到使用了索引(非聚集索引)查找
     
     
     
     
  • 相关阅读:
    约瑟夫环问题拓展 C/C++
    C/C++之STL简介
    详解约瑟夫环问题 C/C++
    HC-SR04超声波传感器
    TCRT5000 红外传感器
    win10的docker无法运行mysql的image,Public Key Retrieval is not allowed
    如何将docker默认的安装位置从C盘改为D盘?
    免费PDF阅读器
    A1B2B3
    动态代理
  • 原文地址:https://www.cnblogs.com/ywnwa417/p/6035252.html
Copyright © 2011-2022 走看看