SQL Server行指针

Jon*_*ert 0 sql sql-server indexing rdbms clustered-index

如果我创建一个堆表并将一堆行放入其中,则每一行在数据文件中都有一个物理位置,并有一个指向该行的指针,但是它没有结构,除了精确的指针之外,无法查找任何内容到给定的行。

如果再创建一个非聚集索引,则该记录按照某种条件对这些行进行排序,那么该索引将为每一行包含其正在排序的键,我明确包括的所有列以及行指针,以便在其中查找记录时一种与索引兼容但需要索引中不包含列的方式,它确切地知道获取数据的位置,对吗?

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

如果有所作为,我将使用SQL Server作为基础引擎。

Pio*_*otr 6

在这种情况下,将重新构建所有非聚集索引,因此将替换所有指针。
确切地说,如果表上具有聚集索引(不必唯一),则SQL Server将存储聚集键值(加上可选的unquier)而不是行指针。

从Microsoft文档:创建聚簇索引
如果在具有多个现有非聚簇索引的堆上创建聚簇索引,则必须重新构建所有非聚簇索引,以便它们包含聚簇键值而不是行标识符(RID)。同样,如果将聚集索引放置在具有多个非聚集索引的表上,则所有非聚集索引都将作为DROP操作的一部分进行重建。在大型桌子上,这可能需要花费大量时间。