Sql-Server

繞過版本儲存以更改列數據類型

  • March 4, 2021

數據庫是 SQL Server 2019 上的 Always On 高可用性同步數據庫,已打開 READ_COMMITTED_SNAPSHOT,我們正在將大型 (1 TB) 表上的列上的數據類型從 varchar 更新為 nvarchar(使用“alter table”命令)。由於版本儲存,它炸毀了我們的 tempdb。

我理解為什麼會發生這種情況,但實際上只是在尋找(可能是創造性的)阻止這種情況發生的方法(最好繞過此命令的版本儲存)。我正在考慮推薦 ADR 至少意味著至少問題與該特定數據庫隔離,但希望聽到任何其他想法。

先說我認為我的想法很蹩腳,但這是一個想法。:)

您可以嘗試創建一個新的空NVARCHAR列(大小合適)並以您的系統可以容忍的速率從 OldVarCharColumn 到 NewNVarCharColumn 進行批量更新。您甚至可以通過迭代循環和使用鍵的滾動範圍(假設它是數字)來自動化整個更新,方法是在每次迭代中設置一個變數(例如WHERE KeyField >= @CurrentIterationValue - 1000 AND KeyField < @CurrentIterationValue)並使用WAITFOR DELAY命令在每次迭代之間暫停任意數量您指定的時間(例如WAITFOR DELAY '00:05:00.000',將暫停執行 5 分鐘)。

一旦您的新列完全更新,您就可以DROP使用 OldVarCharColumn。

只是在玩,發現使用 WITH (ONLINE=ON) 似乎不會寫入版本儲存。請注意,它需要(至少)兩倍的時間,因此將與團隊討論這樣做的利弊。

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