Nas*_*bee 6 sql-server index-tuning
有人问我“我们什么时候需要使用覆盖索引,为什么?” 由 DBA。
我的解释是:
它允许引擎直接从索引本身的值中提取所有相关数据。
对于问我这个问题的 DBA,我的解释并不令人满意。还有哪些相关的细节?
我知道聚集索引和非聚集索引之间的区别
Ken*_*her 13
聚集索引
这个索引就是表。索引信息存储在 b 树页面中,而所有其他列(不在索引中的列)存储在索引的叶级。所有其他索引都将有一个指向该索引的链接,并且将始终包括clustered index其叶级的索引列。这是因为如果 SQL 使用 anon-clustered index并且需要附加信息,它将使用该值来回看聚集索引以查找附加索引。只能有一个聚集索引(显然),因为正如我上面所说,它实际上是表。
非聚集索引
索引值也位于 b 树页面中,但在这种情况下,位于叶级别的唯一数据是返回到clustered index和INCLUDE子句指定的任何列的链接。在UNIQUE索引的情况下,可能还有一个额外的、虚拟的列存储在叶级别,称为uniqueifer.
覆盖索引
正如@KrisGruttemeyer 所说,这是一个非结构性的功能性术语(与其他两个一样)。这只是一个非聚集索引,它包含满足查询所需的所有列(在索引中或在叶级别)。不要忘记所有索引都包含聚集索引列,因此如果您有一个需要 Cols1-4 和 Id(聚集索引)的查询,并且您只有一个索引在 Col1 上并包括 Col2、Col3 和 Col4 的索引,它将仍在覆盖,因为 Id 列将被包括在内,因为它是聚集索引。编辑以回答问题的原因部分:因为您不必对聚集索引进行额外的查找,所以覆盖索引可以快得多。适合查询并覆盖它的最小索引可能是最快的。当然,您还必须考虑拥有索引的开销与获得多少查询的好处,但这远远超出了此处所能提供的范围。
只是为了完整性堆
堆只是一个没有聚集索引的表。页面布局与聚集索引有些不同,但这超出了本问题的范围。
因为我在谈论主键时总是包括这个Clustered Indexes
主键是唯一索引的特例。只能有一个,它可能是集群的,也可能不是。它与聚集索引无关,但很多人感到困惑并认为主键总是聚集的。
| 归档时间: |
|
| 查看次数: |
851 次 |
| 最近记录: |