使用include列创建索引的差异或不使用

时间:2012-05-31 06:36:11

标签: sql sql-server tsql indexing sql-server-2008-r2

我想在Column1和Column2中的SQL Server 2008 R2中创建索引 以下查询有什么区别:

  1. 不包括

    CREATE NONCLUSTERED INDEX [IX_1] ON [dbo].[MyTable] 
    (
        [Column1] ASC,
        [Column2] ASC
    ) ON [PRIMARY]
    
  2. 或者包括:

    CREATE NONCLUSTERED INDEX [IX_2] ON [dbo].[MyTable] 
    (
        [Column1] ASC
    )
    INCLUDE ([Column2]) ON [PRIMARY]
    

1 个答案:

答案 0 :(得分:25)

在第一个Column2中添加到索引键。在第二个中,它可能不会将(*)添加到键中,在这种情况下它只会出现在索引叶页中。这可以允许Column1搜索索引,但是无需返回基表(bookmark lookup/key lookup)来检索Column2的值。

即。它使index2“覆盖”了诸如

之类的查询
SELECT Column1,Column2
FROM [dbo].[MyTable] 
WHERE Column1 = 'X'

它还包括诸如

之类的查询
SELECT Column1,Column2
FROM [dbo].[MyTable] 
WHERE Column1 = 'X' AND Column2 = 'Y' 

但是index1可能对第二个查询表现得更好,因为它可以直接在两列上搜索(而不是只能搜索Column1然后需要在索引叶级别评估所有匹配的行看看它们是否符合Column2谓词)。如果Column2从未用作针对该索引的搜索谓词,并且针对该索引的查询不会因订购Column2而受益,则应将其添加为INCLUDE - d列保持键的大小,减少索引中的页数。

(*)我上面说“可能没有”的原因是因为如果Column2是聚合索引键的一部分,那么will still be added there anyway表示非聚集索引,而不是使用UNIQUE选项。