【问题标题】:Difference of create Index by using include column or not using使用包含列或不使用创建索引的区别
【发布时间】:2012-06-05 09:55:05
【问题描述】:

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

【问题讨论】:

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


    【解决方案1】:

    在第一个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 选项创建的非聚集索引.

    【讨论】:

    • 非常有用的答案
    猜你喜欢
    • 2017-06-07
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-03-19
    • 1970-01-01
    • 2014-08-25
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多