我正在阅读 Dmitry Korotkevich 的《Pro SQL Server Internals》,在第 2 章(表和索引:内部结构和访问方法)中我发现了以下内容:
与聚集索引一样,非聚集索引的中间级和根级从它们引用的级别开始每页存储一行。该行由物理地址和页面中键的最小值组成。另外,对于非唯一索引,它还存储该行的row-id。
在非叶索引页上拥有行 ID 有何意义?这对于 UNIQUE 索引来说是有意义的。因此,如果您已经在根或任何中间级别中找到了一个值,请使用该行 ID 并且不要“加载”叶级别的页面,因为它是唯一的(不会是任何其他匹配项)。由于不需要加载额外的页面,因此节省了大量的处理时间。在非唯一索引中,无论如何都必须在叶级“加载”页面,因为可能存在多个匹配项。那么非唯一索引中的非叶页上的行 ID 有何意义呢?
我希望我已经很好地解释了我不清楚的地方。
SQL Server 存储引擎要求索引中的每个条目在所有级别上始终保持唯一。
对于唯一的非聚集索引,只需要叶上方的非聚集键,因为根据定义它们是唯一的。仅在叶子处需要关联堆或聚集行的完整书签(也称为行定位器,RID)(以定位书签查找的父行)。
对于非唯一非聚集索引,在所有级别添加书签(作为键的一部分)以满足存储引擎要求所有索引条目在每个级别都唯一。
对于行存储堆表,书签是 file:page:row 物理 RID。对于聚集行存储表,书签(逻辑 RID)是聚集键。如果聚集索引不唯一,并且特定键值存在重复项,则聚集键包含整数唯一标识符。
归档时间: |
|
查看次数: |
471 次 |
最近记录: |