TSQL 重新启用约束需要很长时间

Maz*_*har 1 sql-server constraint sql-server-2008-r2

有什么办法可以加快重新启用约束的速度?

作为更新我们仓库中几个表的工作的一部分,这是在几个小时内完成的,重新启用对所述表的约束可能需要一个多小时。其余的工作,即更新,大约需要 5 分钟。在更新开始之前禁用相同的约束是亚秒。

编辑 有问题的工作是在给定日期之前更新数据行上的 PK 和 FK,以防止这些记录出现在报告中。soft delete如果你愿意,一种记录方式。

大多数表格行大小均大于 130m 行,但超过 370m 行的除外。其他两个较小。

TableName   rows
Table_1     371255778
Table_2     131703902
Table_3     131665535
Table_4     131665535
Table_5     131665535
Table_6     131665535
Table_7     19364988
Table_8     1458800
Run Code Online (Sandbox Code Playgroud)

我正在使用以下命令禁用每个表上的约束

ALTER TABLE database.dbo.table_name NOCHECK CONSTRAINT ALL;

以及以下再次重新启用它们

ALTER TABLE database.dbo.table_name WITH CHECK CHECK CONSTRAINT ALL;

没有同时运行的报告或其他作业。

是否需要很长时间才能重新启用约束预期行为,或者是否可以采取一些措施来加快速度?

提前致谢

gbn*_*gbn 6

正如预期的那样。

例如,CHECK 约束:必须针对每个检查约束检查每一行。

如果您有 3 个 CHECK 约束和 3.7 亿行,那么在单个 ALTER 中需要完成 11.1 亿次检查。

每个 UNIQUE 约束必须在同一个 ALTER 中检查所有 3.7 亿行。

这就是我通常不会在 DW 中禁用约束的原因。
这需要太多时间。尤其是当您达到数十亿行时。