使用覆盖索引的原因

Nas*_*bee 6 sql-server index-tuning

有人问我“我们什么时候需要使用覆盖索引,为什么?” 由 DBA。

我的解释是:

它允许引擎直接从索引本身的值中提取所有相关数据。

对于问我这个问题的 DBA,我的解释并不令人满意。还有哪些相关的细节?


我知道聚集索引和非聚集索引之间的区别

Ken*_*her 13

聚集索引

这个索引就是表。索引信息存储在 b 树页面中,而所有其他列(不在索引中的列)存储在索引的叶级。所有其他索引都将有一个指向该索引的链接,并且将始终包括clustered index其叶级的索引列。这是因为如果 SQL 使用 anon-clustered index并且需要附加信息,它将使用该值来回看聚集索引以查找附加索引。只能有一个聚集索引(显然),因为正如我上面所说,它实际上表。

非聚集索引

索引值也位于 b 树页面中,但在这种情况下,位于叶级别的唯一数据是返回到clustered indexINCLUDE子句指定的任何列的链接。在UNIQUE索引的情况下,可能还有一个额外的、虚拟的列存储在叶级别,称为uniqueifer.

覆盖索引

正如@KrisGruttemeyer 所说,这是一个非结构性的功能性术语(与其他两个一样)。这只是一个非聚集索引,它包含满足查询所需的所有列(在索引中或在叶级别)。不要忘记所有索引都包含聚集索引列,因此如果您有一个需要 Cols1-4 和 Id(聚集索引)的查询,并且您只有一个索引在 Col1 上并包括 Col2、Col3 和 Col4 的索引,它将仍在覆盖,因为 Id 列将被包括在内,因为它是聚集索引。编辑以回答问题的原因部分:因为您不必对聚集索引进行额外的查找,所以覆盖索引可以快得多。适合查询并覆盖它的最小索引可能是最快的。当然,您还必须考虑拥有索引的开销与获得多少查询的好处,但这远远超出了此处所能提供的范围。

只是为了完整性

堆只是一个没有聚集索引的表。页面布局与聚集索引有些不同,但这超出了本问题的范围。

 

因为我在谈论主键时总是包括这个Clustered Indexes

主键是唯一索引的特例。只能有一个,它可能是集群的,也可能不是。它与聚集索引无关,但很多人感到困惑并认为主键总是聚集的。