zoukankan      html  css  js  c++  java
  • SQL Server性能优化(10)非聚集索引的存储结构

    一,新建测试表

    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)

    image

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

    DBCC page(IxTest,1,202,3)

    image

    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)

    image

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

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

    image

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

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

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

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

    image

    参考

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

  • 相关阅读:
    linux命令查询网站
    UTC(世界协调时间)时区和各个时区时间的转换
    dev-c++ 中写完源文件生成exe程序怎么避免运行闪退?
    numpy和time计时程序
    进化算法之粒子群算法和Matlab实现(多维)
    tf.config:GPU 的使用与分配(转载)
    限制TensorFlow只在CPU上运行的方法
    Python重要学习链接
    SpringCloud 之 Nacos 注册配置中心
    Jenkins 自动化部署入门详细教程
  • 原文地址:https://www.cnblogs.com/ustcyc/p/4526607.html
Copyright © 2011-2022 走看看