创建非聚集索引时,叶级将包含对原始表中行的引用:
- 如果表有聚簇索引,叶级将包含聚簇索引键;
- 如果表没有聚簇索引(堆),叶级将包含一个指向表中行的物理地址的指针;
我的问题是为什么非聚集索引在这两种情况下都没有设计为包含物理地址(除了聚集索引键之外)。当定义聚集索引时,它可以保存 B-Tree 的读取以进行键查找。
创建非聚集索引时,叶级将包含对原始表中行的引用:
我的问题是为什么非聚集索引在这两种情况下都没有设计为包含物理地址(除了聚集索引键之外)。当定义聚集索引时,它可以保存 B-Tree 的读取以进行键查找。
物理行定位器未存储在非聚集索引叶节点中的一个原因是,每当物理行位置因页面拆分、重组等而发生变化时,都需要更新该值。仅将 CI 键作为唯一行非聚集索引上的定位器避免了这种维护,这在具有许多非聚集索引的表上尤其昂贵。
请注意,这不是堆的考虑因素,因为堆不会受到页面拆分的影响,尽管当行更新为更大的大小时转发指针是一个考虑因素。