我有這個函數,刪除了不再從大表需要用超過10萬行如何從SQL Server中的大量表中刪除時減少事務日誌使用情況?
DELETE FROM BigTable
WHERE DATEDIFF(month,dtmtimestamp, getdate()) > 2)
那麼這個方法我試過,以減少使用的事務日誌的空間量的歷史數據:
WHILE (SELECT COUNT(*) FROM BigTable WHERE DATEDIFF(month,dtmtimestamp, getdate()) > 2) > 0 BEGIN
DELETE TOP 10000 FROM BigTable
FROM BigTable
WHERE DateDiff(month,dtmtimestamp, getdate()) > 2
CONTINUE END
這是正確的方法嗎?或者我會用這種方式使用更多的事務日誌?
這個好方法的任何提示?
乾杯,
尼科
最終答案:
DECLARE @Remainder INT
DECLARE @ChunkSize INT
SET @Remainder = (SELECT COUNT(id) FROM BigTable WHERE dtmtimestamp < DateAdd(month, -2, getdate()))
SET @ChunkSize = CEILING(@Remainder/100) /* Divide the total into 100 parts, whole integers only */
WHILE @Remainder BEGIN
BEGIN TRANSACTION deletehistorical
DELETE TOP (@ChunkSize)
FROM BigTable
WHERE dtmtimestamp < DateAdd(month, -2, getdate());
SET @Remainder = @@ROWCOUNT;
COMMIT TRANSACTION deletehistorical
END
checkpoint命令只告訴引擎從日誌(簡單恢復模式)刪除完成的事務,併爲這個查詢實際上仍然繼續每個循環交易仍在創建。因此,爲了分解事務,我添加了一個BEGIN和COMMIT來強制數據庫每次都進行這些更改。
+1刪除我的評論,因爲我們都有同樣的想法! – 2011-03-10 15:24:04
好的,現在計劃使用偷偷摸摸的方法。 我正在使用簡單的恢復模式,所以沒有備份正在完成,但我想通過數千次刪除進行計費會在事務日誌中創建大量內容,並且需要有時自行清除。所以也許WAITFOR DELAY會解決這個問題。 – NikoRoberts 2011-03-10 19:37:10
我有一個問題。我只看到只爲一個表刪除很多行的示例。如果我需要從數據庫中刪除數百萬條記錄,那麼該怎麼辦?這個「10000」方法是否有效?或者我需要單獨嗎? – jpgrassi 2014-05-05 12:42:44