SQL 服务器行指针

SQL Server row pointers

如果我创建一个堆 table 并将一堆行放入其中,每一行在数据文件中都有一个物理位置,以及一个指向该行的指针,但是它没有结构,不查找超出给定行的精确指针的任何内容的方法。

如果我随后创建一个非聚集索引来按某种标准对这些行进行排序,那么对于每一行,该索引都包含它排序所依据的键、我明确包含的任何列以及行指针,这样如果您以与索引兼容的方式查找记录,但需要一个不在索引中的列,它确切地知道去哪里获取该数据,对吗?

假设这是正确的,我想了解的是:如果我随后在 table 上创建一个聚簇索引,那么堆将被重新组织,以便记录按聚簇索引的排序钥匙。这意味着可能每条记录的物理位置都会发生变化。预先存在的非聚集索引中的行指针如何跟踪它?

如果有区别,我正在使用 SQL 服务器作为底层引擎。

在这种情况下,将重建所有非聚集索引,因此将替换所有指针。
准确地说,如果您在 table 上有聚簇索引(不必是唯一的),SQL 服务器将存储聚簇键值(加上可选的 unquier)而不是行指针。

来自微软文档:Create Clustered Indexes:
如果在具有多个现有非聚集索引的堆上创建聚集索引,则必须重建所有非聚集索引,以便它们包含聚集键值而不是行标识符 (RID)。同样,如果在具有多个非聚集索引的 table 上删除聚集索引,则所有非聚集索引都将作为 DROP 操作的一部分重建。这可能需要大量时间 tables。