一尘不染

通过使用包含列或不使用创建列的创建索引的差异

sql

我想在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]


阅读 173

收藏
2021-03-17

共1个答案

一尘不染

在第一个中,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选项创建的非聚集索引添加该索引键。

2021-03-17