• SQL Server性能优化(9)聚集索引的存储结构


    一、索引的概念和分类

    索引的概念大家都知道,日常开发中我们也会使用常见的聚集索引、非聚集索引。但是除了这两者以外,sqlserver中还提供其他的索引,如:

    a. 唯一索引:不包含重复键的索引,聚集索引或者非聚集索引都可以是唯一索引。

    b. 包含列的索引:它扩展后不仅包含键列,还包含非键列。

    c. 全文索引

    d. 空间索引

    e. 筛选索引

    f. XML

    当然以上几种除了a和b基本上没用到过。

    二、聚集索引的结构

    要想使用聚集索引,必须了解聚集索引的概念以及它的原理。网上对聚集索引描述的资料有很多,最通俗的解释就是拿字典举例:如我们的在新华字典里用拼音查一个汉字“索”的时候,是先从字典最开始几页的字母“s”开始,然后查“suo”,然后找到“索”这个字,根据它的页数,一下翻到这个字所在的页数。

    当然这要求,

    1. 所有的新华字典里的汉字都按照拼音字母顺序排列。

    2. 新华字典前面都有一个拼音的查找附录。

    聚集索引也是这个道理,

    1. 有一个所有数据的“拼音”列表,即索引。

    2. 所有数据根据这个索引在硬盘上有序排列,这个排列顺序就是B树。

    B树的概念:http://www.baidu.com/link?url=5cmF2QROgNE6JUpvbu_9oqwYhdtGvn-1WsCae98nB6eK70H6tc4S3s3sKGfvalbOiwHEUblJIAI6mOivaWk5jq&wd=&eqid=ae27fb0e0003091b00000004555ae6b3&ie=UTF-8

    聚集索引的结构

    聚集索引的级别

    创建测试数据

    --创建测试数据库
    CREATE DATABASE IxTest
    GO
    USE IxTest
    GO
    ---创建测试表
    CREATE TABLE Users
    (
        ID INT PRIMARY KEY IDENTITY(1,1),
        NAME CHAR(80)NOT NULL,
        CreateTime DATETIME NOT NULL DEFAULT(GETDATE())
    );
    GO
    ---插入1000条测试数据
    DECLARE @ID INT=1
    WHILE(@ID<=1000)
    BEGIN
        INSERT INTO Users(NAME)VALUES('张三'+CONVERT(NVARCHAR(20),@ID))
    SET @ID=@ID+1 
    END
    GO
    SELECT * FROM Users 
    GO

    查看页面信息

    ---显示跟踪标志的状态
    DBCC TRACESTATUS
    ---开启跟踪标志
    DBCC TRACEON(3604,2588)
    --DBCC TRACEOFF(3604,2588)
    ---获取对象的数据页,结构:数据库、对象、显示
    DBCC IND(IxTest,Users,-1)
    /*最后一个参数的意思
    1:显示所有分页的信息,包括IAM分页,数据分页,所有存在的LOB分页和行溢出页,索引分页
    -1: 显示所有IAM、数据分页、及指定对象上全部索引的索引分页.
    -2: 显示指定对象的所有IAM分页
    0:显示所有IAM、数据分页.
    */

    image

    image

    再看下索引页(77)的信息

    DBCC page(IxTest,1,77,3)

    image

    页面内部的信息

    image

    再分析数据页(22页)

    DBCC page(IxTest,1,22,3)

    QQ截图20150524171734

    最后回顾下页面信息的分配状态信息

    image

    通过以上描述,我们大体了解了表聚集索引的文件组织结构。当我们按照索引(如ID=100)来查找某一条数据时,经过以下几步

    1. 首先查找索引页,找到这个ID所在的页(这个页在索引里是一行),如第一行是(0~80),第二行是(81~160)。然后定位到这一行。

    2. 这一行里对应的页的ID,找到这个页。

    3. 从硬盘读取这个页。

    所以,本次查询操作是2次硬盘读写,第一次读取索引页,第二次读取数据页。

    image

    参考:

    文内图片内的具体参数解释:SQL Server 深入解析索引存储(上)

  • 相关阅读:
    操作excel语法
    MySQL exists的用法介
    vim 快捷键
    mysql中datetime比较大小问题
    MySQL CAST与CONVERT 函数的用法
    tbxvUZIAJH
    springBoot相关
    springCloud
    Spring Boot使用JavaMailSender发送邮件
    RabbitMq 消息队列
  • 原文地址:https://www.cnblogs.com/ustcyc/p/4524612.html
Copyright © 2020-2023  润新知