为什么删除约束需要这么长时间?

Why does it take so long to drop a constraint?

SQL 服务器 2012 SP3

它是由聚簇索引支持的主键。如果重要,table中有62M行,24GB数据,6.5GB索引(总共3个)。

(编辑:该语句最终失败,表示 dbo.SORT temporary run storage 已填满 PRIMARY(因此磁盘)。

这样大小的 table 很难对其施加约束。有多种解决方法,例如

https://dba.stackexchange.com/questions/53766/dropping-large-clustered-primary-key-fills-up-tempdb

如果删除主要约束,系统将重新组织磁盘上的数据。从资源配置的角度来看,这是昂贵的。

删除聚集索引(不必是 PK)将 table 变成堆并重建所有非聚集索引,因为行定位器已从聚集索引键更改为 RID。

您可以通过先删除非聚集索引来避免重建非聚集索引两次的开销,这样当 table 变成堆时它们就不会受到影响。然后重新创建新的聚簇主键,然后是非聚簇索引。

删除和重新创建非聚集索引的替代方法是在删除聚集索引之前禁用它们 (ALTER INDEX...DISABLE)。当随后创建新的聚簇索引时,禁用的非聚簇索引将自动启用(重建)。这种禁用方法的好处是禁用了索引元数据,这避免了使用非聚集索引创建 DDL 使脚本混乱。

我要补充一点,tables 通常应该有聚簇索引,主键与否。这意味着您需要 space 大约 table 大小的 120% 来支持 recreate/rebuild 聚集索引。