Sql-Server

在 1.5TB 表上啟用頁面壓縮

  • October 27, 2018

我需要想出最好的方法來在大小為 1500 GB、有 363,957,740 行的表上啟用頁面壓縮。數據庫大小本身為 1.71 TB,並保存存檔數據。

如果我理解正確,它需要磁碟空間(可能相同數量,只是為了更安全),以便它可以創建啟用頁面壓縮的表副本並釋放空間。這是在FULL恢復模式中,所以它會被大量記錄。

我已與我的容量規劃資源談過,他同意為此維護提供額外的臨時所需空間,並在此活動完成後收回空間。說了這麼多,你認為最好的方法是:

  1. 進行完整備份
  2. 將備份還原到新的臨時驅動器
  3. 將恢復模式更改為SIMPLE
  4. 啟用頁面壓縮
  5. 壓縮後進行完整備份並恢復原始數據庫
  6. 將恢復模式更改為FULL

此外,而不是啟用頁面壓縮。在第 3 步之後,截斷最大的表,啟用頁面壓縮,然後執行

SELECT * INTO ReplicaDB.dbo.ReplicaTbl

這會在現有索引上啟用頁面壓縮嗎?

我沒有測試環境來測試上述步驟。或者,如果有更好的方法可用,請告訴我。

目標是最小化目前增長所需的未來磁碟空間。我們是一家 ERP 軟體公司,我們擁有企業版許可。此表僅在執行某些檢查並且所有數據都駐留在此表中時用於存檔。我有 2 個索引(1 個 CI,1 個 NON-CI)。沒有一列是VARCHAR (MAX),它們要麼是NVARCHARint要麼是date類型。

在表或索引級別啟用頁面壓縮。您可以擁有一個帶有頁面壓縮索引的未壓縮表或一個帶有未壓縮索引的壓縮表。如果您希望索引被頁面壓縮,您需要單獨執行此操作。

我的印像是,這一舉措最重要的考慮是能夠歸還分配給您的所有臨時空間。SELECT INTO對於您正在嘗試做的事情來說,這不是一個好的選擇。該表將在未壓縮且沒有聚集索引的情況下建構。建構這將需要一個REBUILD這將增加您的數據文件,這正是您想要避免的。

以下是我會考慮這樣做的方式:

  1. 對舊數據庫進行完整備份。
  2. 將備份還原到同一伺服器上的臨時數據庫。
  3. 在臨時數據庫上將恢復模式更改為簡單。
  4. 截斷日誌。
  5. 截斷目標表。
  6. 創建具有頁壓縮聚集索引且沒有非聚集索引的目標表。
  7. 將舊數據庫中的所有行插入到帶有TABLOCK提示的目標表中。此操作可能需要很長時間,但應該最少記錄並且不需要排序。
  8. 使用頁面壓縮一次建構一個非聚集索引。
  9. 切換到完全恢復模式。
  10. 進行完整備份。在切換恢復模式後執行此操作意味著您不必進行另一次備份。
  11. 在原始數據庫上恢復您的臨時數據庫。
  12. 測試後刪除舊數據庫的備份,並且您確信一切都已檢查。

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