SQL Server在索引上创建索引

SQL Server在索引上创建索引,sql,sql-server-2008,indexing,Sql,Sql Server 2008,Indexing,只是想知道当我们创建SQL Server时,SQL Server内部会发生什么 聚集索引上的非聚集索引 聚集索引优于非聚集索引 非聚集索引优于非聚集索引 请发表意见。对于所有执行计划,我使用了相同的基表,其中填充了无意义的数据: CREATE TABLE dbo.T (ID INT NOT NULL, Filler CHAR(200) NULL); INSERT dbo.T (ID, Filler) SELECT ROW_NUMBER() OVER(ORDER BY Object_ID),

只是想知道当我们创建SQL Server时,SQL Server内部会发生什么

  • 聚集索引上的非聚集索引
  • 聚集索引优于非聚集索引
  • 非聚集索引优于非聚集索引

  • 请发表意见。

    对于所有执行计划,我使用了相同的基表,其中填充了无意义的数据:

    CREATE TABLE dbo.T (ID INT NOT NULL, Filler CHAR(200) NULL);
    INSERT dbo.T (ID, Filler)
    SELECT  ROW_NUMBER() OVER(ORDER BY Object_ID), 
            CAST(NULLIF(ABS(Object_ID) % 10, 0) AS CHAR(200))
    FROM    sys.all_objects
    

    1.当我们在聚集索引上创建非聚集索引时,SQL Server内部会发生什么。 这只是一个普通的创建索引过程,因此在指定的manor中对数据进行排序,并从叶节点向上创建相关节点。叶节点将存储一个指向聚集索引的“指针”,以允许键查找

    因此,一旦聚集索引在
    dbo.T(ID)
    上就位,创建非聚集索引的执行计划将显示排序:

    将鼠标悬停在排序上表示它是通过
    填充程序进行排序的,然后添加它自己的排序以确保排序是确定的:


    2.当我们在非聚集索引上创建聚集索引时,SQL Server内部会发生什么。 我认为为了正确地解释这一点,我需要解释没有聚集索引的表上的聚集索引是如何工作的。没有聚集索引的表称为“Heap”表,这只是意味着数据不按特定顺序存储,通常只按插入顺序存储。本质上,SQL Server在内部列RowID上构建其自己的聚集索引,但是,如果没有显式聚集索引的约束,它可以在认为合适时自由地移动数据(),非聚集索引将在叶级存储RowID的索引,这样它就可以执行查找

    然后,在堆表上创建聚集索引时,必须重新生成该表,并按指定的列排序,这意味着也会删除并重新生成所有索引。为了显示这一点,我首先将非聚集索引添加到
    dbo.T

    CREATE NONCLUSTERED INDEX IX_T_Filler ON dbo.T (Filler);
    

    与上面不同的是,您可以看到表扫描是在没有可使用的聚集索引的情况下完成的,并且在创建索引时完成的排序没有像上面那样包括ID列:

    然后添加聚集索引:

    CREATE CLUSTERED INDEX IX_T_ID ON dbo.T (ID);
    
    您可以在执行计划中看到,非聚集索引也被重建,因此叶将指向新的聚集索引,而不是像以前那样指向行ID。(注意,第二个查询与第一部分中在聚集索引上构建非聚集索引时相同)


    3.当我们在非聚集索引上创建非聚集索引时,SQL Server内部会发生什么。
    非聚集索引彼此完全独立,因此这与1相同(如果没有聚集键,则为2的第一部分),也就是说,不管已经存在多少非聚集索引,创建新索引的方法都是一样的。

    这是一个模糊的问题,只会引起基于意见的讨论,甚至不包括一个特定的数据库。这就是我投票关闭它的原因。@GordonLinoff请指定您还需要什么信息?我知道这是一个基于讨论的问题,但我仍然感到困惑。任何帮助都是非常感激的“结束”是什么意思?索引是一个索引,它不会“覆盖”其他索引。@ypercube:我的意思是,如果列上已经有聚集索引,并且我创建了非聚集索引。内部会发生什么