在 SQL Server 中将堆更改为聚簇表时会发生什么?

Jus*_*ner 5 sql-server clustered-index heap

据我了解,堆是一个无序的对象。当您插入一条记录时,SQL Server 使用 IAM 页获取属于该堆的页,并使用 PFS 页查找具有足够空间容纳该记录并插入其中的特定页。

当您在其上创建聚簇索引时,它就变成了一个聚簇表,而聚簇索引本身就变成了表。但是由于聚集索引和原始堆是两种不同的结构,SQL Server 是否会创建一个新结构(聚集索引)并将所有内容从帮助移动到新结构然后删除堆?

有很多东西可以在表上定义,比如触发器、约束、权限等。如果我的假设是真的,那意味着 SQL Server 也将所有这些东西移动到新结构中。我在文档中没有找到任何相关信息。我的理解正确吗?

Dav*_*oft 13

是的,当您在堆上创建聚集索引时,所有行都会排序移动到新的聚集索引。使用新的聚集索引键作为行定位符重建任何非聚集索引。

但是,它是同一张表,因此触发器、约束等不必更改。

然而,反过来就不是这样了。当您删除表上的聚集索引时,聚集索引的叶级页会留在原地,它们成为新的堆。当行定位器从 CI 键切换到 rowid (file:page:slot) 时,仍会重建非聚集索引。