在MS SQL Server中创建索引时,INCLUDE()函数做什么?



使用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
)

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

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

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

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

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

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

有关更多信息,请参阅Microsoft文档:创建包含列的索引

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

但是,在索引中包含列会占用索引结构本身的开销(这是对复制值的补充(。

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

最新更新