为什么删除主键很昂贵?

Kar*_*ger 3 sql-server

我有一个带有集群 PK 的表。没有外键引用它。当我放下它时,我希望它或多或少是瞬间的,但它却非常缓慢。

我的假设是,我们只是删除了一些元数据,而没有对未来更新和插入的约束或集群。

内部实际发生了什么使这变得昂贵?

Han*_*dyD 11

放弃 PK 约束和底层聚集索引代价高昂的原因之一是底层数据被转换为 HEAP。这会影响所有非聚集索引,它们必须将指向行数据的指针从旧的聚集索引键更新回新的 HEAP 行。从文档

从非聚集索引中的索引行到数据行的指针称为行定位符。行定位器的结构取决于数据页是存储在堆中还是聚簇表中。对于堆,行定位符是指向行的指针。对于聚簇表,行定位符是聚簇索引键。

因此,一旦删除 PK 和聚集索引,非聚集索引的行定位器就会从聚集索引键更新为堆指针。根据索引的大小和数量,此更新可能涉及大量成本。

这篇文章也解释了这一点

删除聚集索引可能需要一些时间,因为除了删除聚集索引之外,还必须重建表上的所有非聚集索引,以使用指向堆的行指针替换聚集索引键。