21

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

  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]
    
4

1 回答 1

25

在第一个Column2被添加到索引键中。在第二个中,它可能不会(*)添加到键中,在这种情况下,它只会出现在索引叶页中。这可以允许搜索索引,Column1但避免需要返回基表(书签查找/键查找)来检索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是(部分)聚集索引键,它仍然会被添加到那里,UNIQUE因为它不是使用该选项创建的非聚集索引。

于 2012-05-31T06:39:55.783 回答