Sql-Server

將大表上的速度更改列增加到 NON NULL

  • June 9, 2019

我最近在一個有近 5 億行的表中添加了一個 NULL 位列。該列沒有預設值,但是所有插入都指定值 0 或 1,並且我執行了一個一次性常式來為所有現有行分配 0 或 1(小批量更新行)。現在,每一行在該列中應該有一個 0 或 1。

我想讓位列不可為空,但是當我嘗試通過這樣做時ALTER TABLE t1 ALTER COLUMN c1 bit not null,它開始執行 3 分鐘,然後我停止了它,因為它阻止了對錶的所有讀取,我懷疑它需要很長時間才能完成. 可能不會花太長時間,但我不能冒太多不可用的風險。回滾本身需要 6 分鐘。

您對如何使列不可為空而不需要花費數小時才能完成有什麼建議嗎? 另外有沒有辦法估計ALTER TABLE ALTER COLUMN我開始然後取消的語句需要多長時間才能完成?

我正在使用 SQL Server 2017 網路版。

CHECK CONSTRAINT您可以添加一個不允許該列為 NULL 的值,而不是更改列定義。該表仍需要掃描,但不需要修改每個數據頁,因此它應該是一個更快的操作。遺憾的是,在操作過程中仍會持有 Sch-M 鎖。一個技巧是在嘗試添加約束之前嘗試將盡可能多的表放入緩衝池。這可能會減少持有 Sch-M 鎖的時間。

然後,您可以在下一個維護視窗期間刪除約束並更改列定義。

如果您使用的是企業版 (EE),則更好的策略可能是將其添加為NOT NULL預設值01(以最常見的為準)。

這是EE 中僅元數據的更改。然後更新需要翻轉的。這意味著更新更少,完成後無需更改列可空性。-馬丁史密斯

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