Sql-Server

回收未使用的數據庫硬碟空間的最有效方法是什麼?

  • March 10, 2019

免責聲明:我不是 DBA,我提出這個問題是為了幫助研究同事遇到的問題。

我們有一個無意中膨脹到 300+ GB 的數據庫。我們已經在我們的應用程序中關閉了導致此問題的選項,但我們想要清除有問題的數據(僅在 1 個表中)並回收它在硬碟驅動器上佔用的空間。我們嘗試過截斷表,然後在生產數據庫的副本上收縮它,但這個過程大約需要一周時間。

有沒有更快/更好/更有效的方法來做到這一點?我讀過縮小數據庫是 DBA 的禁忌,因為它引入了索引碎片。

我們正在使用 Microsoft SQL Server。

“最佳方式”轉化為最快且最不可能在未來給我們造成問題(如索引碎片可能)。我們正在嘗試盡快完成此操作,以便我們的數據庫不會在幾天內被佔用,刪除數據和縮小文件。

這種情況有兩種選擇:

  1. 收縮數據文件,然後重建索引。正如您所說,這很耗時,而且您主要是隨心所欲地使用儲存子系統。

2)創建一個新的文件組,並將所有數據遷移到新的文件組中,一次一張表。完成後縮小舊文件組,然後將所有內容重新移回,或保持原樣。

第二個選項增加了一些複雜性,並為額外的 FG 增加了額外的維護,但可能是您所追求的,因為您一次可以移動一張桌子。您可以通過更改每個表的聚集索引以在新文件組中重建來做到這一點。

添加文件組:

(見https://msdn.microsoft.com/en-us/library/bb522469.aspx

USE master  
GO  
ALTER DATABASE AdventureWorks2012  
ADD FILEGROUP NewFG;  
GO  

將文件添加到文件組:

ALTER DATABASE AdventureWorks2012   
ADD FILE   
(  
   NAME = FG2,  
   FILENAME = 'G:\DATA\FG2.ndf',  
   SIZE = 500MB,  
   MAXSIZE = UNLIMITED,  
   FILEGROWTH = 250MB  
)  
TO FILEGROUP NewFG;  
GO  

在新文件組中重建聚集索引:

CREATE UNIQUE CLUSTERED INDEX [PK_Example] ON Test.dbo.Example(ExampleID) 
WITH (DROP_EXISTING = ON) ON [NewFG]
GO

我很確定截斷是最有效的方法。但是,您可能想要重新索引表。希望這可以幫助!

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