Sql-Server

如果文件位於不同的磁碟陣列中,我應該執行多個 DBCC Shrinkfile 嗎?

  • April 5, 2019

我們剛剛刪除了數據庫中大約 45% 的數據,並且我們想要減小 mdf 文件的大小(現在我們有一個“刪除舊數據作業”,所以它在不久的將來不會再增長那麼多) .

我的問題是:

如果我同時執行多個 DBCC Shrinkfile,並且文件在不同的陣列磁碟上,那麼收縮的總時間會更短嗎?與一次執行一個文件的 DBCC Shrinkfile 相比。

這將在維護視窗上執行,其想法是使此維護視窗盡可能短。

問候

您的任務是減小mdf文件的大小,對嗎?

縮小數據庫dbcc shrinkdatabase速度非常慢。它是單執行緒的。

有一種更快的方法來減少數據庫大小:

  1. 創建新文件組並根據需要為該文件組分配空間(確定舊文件中實際使用了多少空間)
  2. 將所有數據移動到該文件組並刪除舊的

該解決方案可以是多執行緒的,因此速度會更快

如果您正在尋找更快的性能,您可能希望最初DBCC SHRINKFILE使用該TRUNCATEONLY選項執行。每提單

只截斷

將文件末尾的所有可用空間釋放給作業系統,但不執行文件內的任何頁面移動。數據文件僅收縮到最後分配的範圍。如果使用 TRUNCATEONLY 指定,則忽略 target_size。TRUNCATEONLY 選項不會移動日誌中的資訊,但會從日誌文件的末尾刪除不活動的 VLF。FILESTREAM 文件組容器不支持此選項。

如果幸運的話,您通過清理操作清除的大量空間將位於數據文件的末尾,並且指定該TRUNCATEONLY選項將比任何其他DBCC SHRINKFILE操作更快地將該空間釋放回作業系統,因為不會發生數據移動發生在數據文件本身中。

執行這個命令很簡單,如下:

DBCC SHRINKFILE (DatabaseFile_LogicalName, TRUNCATEONLY)

如果這不能將足夠的空間釋放回作業系統,那麼您將需要評估其他方法,例如 George K 提供的先前答案,這可能參考了 Paul Randall 的文章,為什麼您不應該縮小您的數據文件

最後,另一種更手動的方法是在多個不同的維護視窗期間多次DBCC SHRINKFILE使用該選項執行。TRUNCATEONLY在初始操作之後,您將禁用您認為需要進一步注意的任何數據文件的自動文件增長。如果幸運的話,您的標準維護將在文件中充分調整數據,以便您可以在將來DBCC SHRINKFILE使用該選項執行其他操作,TRUNCATEONLY以進一步減少文件,而無需在其中移動數據。在文件達到更理想的大小後,重新啟用自動增長,這樣您就不會在數據文件開始隨著時間的推移再次增長時遇到數據庫停止問題。

禁用數據文件的自動增長,請執行以下命令:

ALTER DATABASE [DatabaseName] MODIFY FILE ( NAME = N'DatabaseFile_LogicalName', FILEGROWTH = 0)

要重新啟用數據文件的自動增長,以便在每個自動增長事件期間其大小增加 500MB,請執行以下命令:

ALTER DATABASE [DatabaseName] MODIFY FILE ( NAME = N'DatabaseFile_LogicalName', FILEGROWTH = 500MB)

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