2017-09-05 106 views
-1

我有一個生產SQL Server 2008,其中8 TB遍佈多個數據庫。 我已經刪除了大約85%的數據,並且必須恢復磁盤空間。 所有USED_SPACE的最終總和爲1.2 TB。提高SQL Server DBCC SHRINKFILE的性能

SHRINKFILE過程必須適合每個數據庫7小時的維護時段。

但是每個人的DBCC SHRINKFILE需要MANY幾個小時才能運行。例如,將800 GB數據庫縮小至120 GB需要15個小時以上。

不幸的是,超過了我的維護窗口,我不得不殺死這個進程,希望數據庫不會被破壞(後面的DBCC CHECKDB顯示它們很好)。

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

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

注意:數據庫全部設置爲SIMPLE恢復模式並且AUTO_SHRINK已關閉。

是的,我看到很多人說永遠不會這樣做,因爲它破壞索引 - 我打算在SHRINKFILE完成時重建索引。

有沒有辦法提高SHRINKFILE命令或其他解決方案的優先級?以下是我正在考慮的一些選項:

  • SET DEADLOCK_PRIORITY HIGH在運行SHRINKFILE之前的同一會話中。 (但我懷疑這會有幫助。)
  • 創建一個新的數據庫並逐個複製所有數據。

請幫忙。

+2

這實際上與**編程**(其中*本站*全部是關於**)沒有任何關係,但是使用數據庫管理 - 因此它在這裏是脫離主題並屬於[dba。 stackexchange.com](http://dba.stackexchange.com) - 投票移動。 –

+0

你說得對。有沒有辦法移動它 - 或者我應該在那裏創建一個新的? – Don

+0

系統將遷移它,一旦共有五張選票遷移它 –

回答

0

DBCC SHRINKFILE id單線程操作,所以它在服務器上佔用太多時間。

解決方法:首先重建與MAXDOP *指數(因爲這會安排數據和索引)

然後執行DBCC SrinkFiles。

Maxdop - 您想查詢的線程數量可以使用。

+0

我試過了,但沒有縮短縮短時間。它看起來是對所有數據頁面進行碎片整理。我注意到,通過與數據庫的任何連接的活動似乎幾乎暫停收縮過程。防止任何連接是目前似乎有用的唯一操作。 – Don