Sql-Server-2008-R2

DBCC SHRINKFILE 性能

  • December 3, 2018

我有一個 8 TB 的生產 SQL Server 2008,分佈在多個數據庫中。我已經刪除了每個數據庫中大約 85% 的數據,並且必須恢復磁碟空間。所有 USED_SPACE 的最終總和將為 1.2 TB。

此 SHRINKFILE 程序必須適合每個數據庫的 7 小時維護視窗。

然而,每個 DBCC SHRINKFILE 都需要很多小時才能執行。例如,將 800 GB 的數據庫縮小到 120 GB 需要超過 15 個小時。

不幸的是,這超出了我的維護視窗,我被迫終止程序,希望數據庫不會損壞(隨後的 DBCC CHECKDB 顯示它們很好)。

我可以看到 DBCC SHRINKFILE 沒有充分利用可用的磁碟 I/O 和 CPU 資源。

例如,可以在幾個小時內將完整大小的數據庫文件從一個磁碟複製到另一個磁碟,但 SHRINKFILE 過程需要相當長的時間。

注意:數據庫都設置為簡單恢復模式並且 AUTO_SHRINK 關閉。

是的,我看到很多人說永遠不要這樣做,因為它會破壞索引 - 我確實計劃在 SHRINKFILE 完成時重建索引。

有沒有辦法增加 SHRINKFILE 命令或任何替代解決方案的優先級?以下是我正在考慮的一些選項:

  • 在執行 SHRINKFILE 之前,在同一會話中設置 DEADLOCK_PRIORITY HIGH。

(但我懷疑這會有所幫助。)

  • 創建一個新數據庫並逐表複製所有數據。

解決方案是留出額外的空間。

縮小 MDF 文件時,如果我留下一些未使用的空間(不要刪除所有未使用的空間),那麼它完成的速度要快得多。

例如:如果一個 3TB 的數據庫只使用了 200MB,將其縮小到 200MB 將需要很長時間。但是,如果我將其縮小到 300MB,那麼縮小過程會快得多。

我猜 SQL 必須將數據碎片整理到極致才能刪除所有未使用的空間。然而,通過留出額外的空間,它只能重新組織更大的數據部分,或者以其他方式調整文件指針以適應。

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