【问题标题】:What INCLUDE() function does when creating index in MS SQL Server?在 MS SQL Server 中创建索引时,INCLUDE() 函数的作用是什么?
【发布时间】:2020-01-23 18:12:39
【问题描述】:

使用INCLUDE函数创建索引与不创建索引有什么区别?

以下两个索引有什么区别?

CREATE NONCLUSTERED INDEX SomeName ON SomeTable (
    ColumnA
    ,ColumnB
    ,ColumnC
    ,ColumnD
    ) INCLUDE (
    ColumnE
    ,ColumnF
    ,ColumnG
    )

对比

CREATE INDEX SomeName ON SomeTable (
    ColumnA
    ,ColumnB
    ,ColumnC
    ,ColumnD
    ,ColumnE
    ,ColumnF
    ,ColumnG
    )

【问题讨论】:

    标签: sql sql-server indexing clustered-index


    【解决方案1】:

    INCLUDE 子句在最低/叶级别添加数据,而不是在索引树中。这使得索引更小,因为它不是树的一部分。

    INCLUDE 列不是索引中的键列,因此它们没有排序。这意味着它对于谓词、排序等并不是真正有用。但是,如果您在键列的几行中进行残差查找,它可能会很有用。

    INCLUDE 列不是索引中的键列,因此它们没有排序。这使得它们通常不适用于 JOIN 或排序。而且因为它们不是键列,所以它们不像键列那样位于整个 B 树结构中

    通过添加包含(或非键)列,您可以创建涵盖更多查询的非聚集索引。这是因为非键列具有以下好处:

    • 它们可以是不允许作为索引键列的数据类型。
    • 在计算索引键列数或索引键大小时,数据库引擎不会考虑它们。

    当查询中的所有列都作为键或非键列包含在索引中时,具有包含列的索引可以显着提高查询性能。性能提升是因为查询优化器可以定位索引中的所有列值;不访问表或聚集索引数据,从而减少磁盘 I/O 操作。

    有关详细信息,请参阅 Microsoft 文档:Create Indexes with Included Columns

    【讨论】:

      【解决方案2】:

      当执行计划使用索引时,它可以访问索引中的所有列。如果给定表的所有列都在索引中,则无需引用原始数据页。消除数据页查找会提高效率。

      但是,在索引中包含列会对索引结构本身产生开销(这是除了复制值之外)。

      INCLUDE 关键字允许列值在索引中,而不会产生额外索引结构的开销。目的是解决查询,而无需在原始数据页上查找列信息。

      【讨论】:

        猜你喜欢
        • 2010-11-21
        • 1970-01-01
        • 2020-09-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多