Sql-Server

TSQL 重新啟用約束需要很長時間

  • November 29, 2017

有什麼辦法可以加快重新啟用約束的速度?

作為在我們的倉庫中更新幾個表的工作的一部分,這是在幾個小時內完成的,重新啟用對所述表的約束可能需要一個多小時。剩下的工作,更新,大約需要 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

我正在使用以下命令禁用每個表上的約束

ALTER TABLE database.dbo.table_name NOCHECK CONSTRAINT ALL;

以及以下重新啟用它們

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

沒有報告或其他作業同時執行。

重新啟用約束預期行為需要很長時間,還是可以採取一些措施來加快速度?

提前致謝

正如預期的那樣。

例如,CHECK 約束:必須針對每個檢查約束檢查每一行。

如果您有 3 個 CHECK 約束和 3.7 億行,則需要在單個 ALTER 中完成 11.1 億次檢查。

每個 UNIQUE 約束必須在同一個 ALTER 中檢查所有 3.7 億行。

這就是為什麼我通常不在我的 DW 中禁用約束的原因。

這需要太多時間。尤其是當您達到數十億行時。

引用自:https://dba.stackexchange.com/questions/191965