Sql-Server

更新大表的更多最佳實踐?

  • December 19, 2018

我知道這個問題有很多主題,但我一直在尋求更多的見解。

我有一個包含十億多條記錄的大表。記錄的數量可以減少和存檔,但大小仍然很大。我的任務是更改單個列的現有數據類型,其中舊數據值可以安全地轉換為類型。

以下是我的一些方法:

1 - 刪除影響目標列的表約束,刪除也影響目標列的索引,在表末尾添加一個帶有 NULL 的新列,用 10K 塊的舊列值更新新列, 50K 或 100K 增量,在複製數據後刪除舊列並僅為該列重新應用索引。

2 - 將所有數據複製到新表中,數據類型像以前一樣以塊的形式更改,驗證數據是否完成,刪除舊表,將新表重命名為舊表並應用索引。

3 - 使用 BULK INSERT 和 MERGE SP 將來自另一個數據源(如平面文件)的所有數據導入到新表中,數據類型發生變化,基本上類似於選項 2,有 2 個重複表,驗證數據,刪除舊表以替換為新表和應用索引。

什麼是最快和最安全的選擇?還有其他我沒有考慮的選擇嗎?我已經使用選項 1 很好地更新了其他表的 1 億條記錄。表越大,由於更新的持續時間,選項 1 變得越難。

我一直選擇選項 #2,並且這樣做的方式對系統的影響最小,因為它總是假設該應用程序將連續執行,或者最多執行 30 分鐘。因此,我將建構新表並在一周內將數據緩慢遷移到其中。我會使用 SQL 代理作業來插入行,並使用AFTER UPDATE, DELETE觸發器來保持已遷移的行同步。

我在 SQL Server Central 上的一篇文章中詳細介紹了這種方法:在幾秒鐘內重構 1 億行(或更多)表。SRSLY!.

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