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

meh*_*tfi 21 sql t-sql sql-server 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]
    
    Run Code Online (Sandbox Code Playgroud)
  2. 或包括:

    CREATE NONCLUSTERED INDEX [IX_2] ON [dbo].[MyTable] 
    (
        [Column1] ASC
    )
    INCLUDE ([Column2]) ON [PRIMARY]
    
    Run Code Online (Sandbox Code Playgroud)

Mar*_*ith 25

在第一个中Column2添加到索引键.在第二个中,它可能不会(*)被添加到键中,在这种情况下它只会出现在索引叶页中.这可以允许搜索索引,Column1但是避免需要返回基表(书签查找/键查找)来检索值Column2.

即它使index2"覆盖"查询,如

SELECT Column1,Column2
FROM [dbo].[MyTable] 
WHERE Column1 = 'X'
Run Code Online (Sandbox Code Playgroud)

它还包括诸如的查询

SELECT Column1,Column2
FROM [dbo].[MyTable] 
WHERE Column1 = 'X' AND Column2 = 'Y' 
Run Code Online (Sandbox Code Playgroud)

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

(*)我上面说"可能没有"的原因是因为如果Column2是(聚合索引键)的一部分,它仍将被添加到那里,无论如何,对于不使用该UNIQUE选项创建的非聚簇索引.