SQL Server创建索引索引

时间:2013-12-30 12:40:12

标签: sql sql-server-2008 indexing

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

  1. 非聚集指数聚集。
  2. 非聚集索引的聚簇索引。
  3. 非聚集索引的非聚集索引。
  4. 请评论。

1 个答案:

答案 0 :(得分:1)

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

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内部会发生什么。

这只是一个普通的创建索引过程,因此对指定的庄园中的数据进行排序,并从叶节点创建相关节点。叶节点将“指针”存储回聚簇索引以允许密钥查找。

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

enter image description here

将鼠标悬停在排序上会显示它是按Filler排序,然后添加它自己的排序以确保排序是确定性的:

enter image description here


2。当我们在非聚集索引上创建聚簇索引时,SQL Server内部会发生什么。

我认为要正确解释这一点我需要解释一个没有聚簇索引的表上的聚簇索引是如何工作的。没有聚簇索引的表称为“堆”表,这只是表示数据没有按特定顺序存储,通常只按插入顺序存储。表示SQL Server构建自己的聚簇索引。内部列RowID,但是没有显式聚簇索引的约束,只要它看起来合适( More reading on Forwarding records )就可以自由移动数据,然后非聚集索引将存储叶级别的rowID,因此它有一种执行查找的方式。

然后,当您在堆表上创建聚簇索引时,必须重建该表,按您指定的列进行排序,这意味着还会删除并重建所有索引。为了表明这一点,我首先将非聚集索引添加到dbo.T

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

enter image description here

与上面不同,您可以看到表扫描已完成,因为没有要使用的聚簇索引,并且在创建索引时完成的排序不包括上面的ID列:

enter image description here

然后添加聚集索引:

CREATE CLUSTERED INDEX IX_T_ID ON dbo.T (ID);

您可以在执行计划中看到非重组索引也已重建,因此叶子将指向新的聚簇索引而不是之前的行ID。 (注意第二个查询与在聚簇索引上构建非聚集索引时的第一个部分相同)

enter image description here


3。当我们在非聚集索引上创建非聚簇索引时,SQL Server内部会发生什么。

非聚簇索引完全相互独立,因此这与1相同(如果没有聚簇键,则与2的第一部分相同),即,已存在多少非聚簇索引无关紧要,方法创建一个新的保持不变。