2015-10-28 72 views
2

我有一個非常大的表的數據庫。 (150 GB) 該表的主要內容是varbinary(max)列中的PDF文件。SQL Server - 刪除65%的內容 - 數據庫收縮好嗎?

現在,我們終於將大部分PDF文件從數據庫中移走了。 所以我現在的任務是更新表格並在100萬行的95%中將PDF設置爲NULL。

我使用這種方法來更新表。

  • 將恢復模型設置爲簡單。

  • 更新5000行的塊。 RAISERROR只是爲了讓我看到發生了什麼事情,因爲PRINT語句只是被緩衝,並且只在整個語句完成時才顯示。

我的問題是如下:

是不是還好我的事後收縮數據庫?

我知道這會導致索引碎片化,所以如果我之後運行索引優化器腳本,在這種情況下DB會縮小,這樣做很好;)?

DECLARE @msg AS nvarchar(200) 
DECLARE @Stopper AS int = 1 
DECLARE @IdRange AS int = 0 
DECLARE @MaxId AS int = (SELECT MAX(ID) FROM EmailLog) 

DECLARE @COUNT AS int = 5000 

SET @IdRange = @COUNT 

WHILE (@Stopper = 1) 
BEGIN 

    UPDATE dbo.EmailLog 
    SET 
     PdfFile = NULL 
    WHERE InvoiceNo > 0 AND 
      Id BETWEEN @IdRange - @COUNT AND @IdRange 

    SET @IdRange += @COUNT 

    IF (@MaxId < @IdRange + @COUNT) 
    BEGIN 
     SET @Stopper = 0; 
    END 
    ELSE 
    BEGIN 
     SET @msg = 'Max @IdRange is now:' + CAST(@IdRange AS nvarchar(20)) 
     RAISERROR(@msg, 0, 1) WITH NOWAIT 
    END 
END 
+0

我認爲這裏的一個主要問題是:您預計數據庫有多快會再次增長(或根本?)。因爲當它再次發狂時,它將需要重新分配磁盤大小,否則它將被分配。 – Thomas

+0

我已經在一個測試分貝上做了這個。它從135 GB變爲48 GB。所以是的,它會再次增長,但不會達到相同的規模,未來幾年=) – Gombi

+0

好的。然後我沒有看到太多反對它。但讓我們看看是否有人提出了另一個點。 – Thomas

回答

1

是的,如果你刪除了大量的數據,你不希望這個數據庫重新生長出來,在這個尺寸很長一段時間,這將是罰款收縮的數據庫,只要你重新編制(或在收縮之後對指標進行碎片整理)。