Sql-Server

在大型數據庫上更改數據類型的最佳方法?

  • March 17, 2022

我有一些大的(1tb 數據,600gb)數據庫,我注意到它有很多不好的數據類型,比如 varchar(max)、varchar(500) 只使用 2 或 3 個字元,甚至更多。

更改數據類型的過程會影響表中的日誌大小和鎖嗎?

我假設如果我在進行這些更改之前將數據庫設置為簡單,我將不會面臨太多空間問題,但對於鎖來說,這完全會有停機時間,對吧?

我假設如果我在進行這些更改之前將數據庫設置為簡單,我將不會面臨太多空間問題

不,那不是真的。每個ALTER TABLE語句將作為一個事務。因此,即使使用SIMPLE恢復模型,您最終可能會在事務日誌中出現大量活動 - 如果我在此問答中執行的測試成立,則可能高達該列使用的空間的 2 倍:Fast alter column NVARCHAR(4000)到 NVARCHAR(260)

因此,您需要為此做好準備,確保您現有的日誌文件足夠大以在單個事務中處理該數量,或相應地增加日誌文件,並確保您不會填寫磁碟。

但是對於鎖來說,這是完全要停機的東西,對嗎?

對。嗯,有點。如果實例正在執行企業版(並且您的表不違反此處記錄的無數限制),那麼您可以使用ONLINE=ONwithALTER COLUMN語句來限制鎖定。

當列引用被交換時,仍然會在操作結束時使用 Sch-M 鎖,但它並不像替代方案那麼糟糕。該表在操作期間基本上可用於正常查詢。

如果您無法ALTER COLUMN線上執行,那麼是的,您需要安排停機時間。該ALTER語句將在操作期間取出表上的 Sch-M 鎖,這將阻止對錶的所有正常讀寫操作。

您可能不想“就地”執行此操作,尤其是在多個表中有多個列的情況下。將此視為遷移或主要版本升級;準備一個具有所需模型的新數據庫,然後一次性將您的數據 ETL 到其中。如果需要,有一些方法可以最大限度地減少停機時間,例如邏輯複製。

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