簡體   English   中英

從SQL Server中的大型表中刪除時,如何減少事務日志的使用?

[英]How can I reduce transaction log usage when deleting from a massive table in SQL Server?

我有此功能可刪除具有超過1000萬行的大表中不再需要的歷史數據

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來強制數據庫每次進行這些更改。

您應該使用EXISTS (而不是計算仍要刪除的行數)(因此,一旦找到行,它就會返回):

WHILE EXISTS(SELECT * FROM BigTable WHERE DATEDIFF(month,dtmtimestamp, getdate()) > 2) BEGIN

還是運動鞋:

select top 1 * from sysobjects /* Force @@ROWCOUNT > 0 */
WHILE @@ROWCOUNT BEGIN
    DELETE TOP 10000 FROM BigTable
    FROM BigTable
    WHERE dtmtimestamp< DateAdd(month, -2,getdate())
CONTINUE END

該表的唯一搜索是用於實際刪除的搜索。

如果dtmtimestamp列具有有用的索引,我也討論了您的日期邏輯。

當然, 編輯 ,馬丁指出,無論這些地址事務日志的使用。

限制刪除的策略是一種合理的策略,可以停止可怕的日志使用,但是還需要同時進行大量日志備份或截斷,以允許重用舊的事務日志空間。 否則,它仍然會增加日志。

如果您知道每隔15分鍾就會發生一次日志備份,那么您可能想通過WAITFOR DELAY每隔“ n”次迭代來暫停循環,以便您知道以前的事務日志已被備份/清除。 無論發生什么情況,只要您要刪除而不是將其截斷,每個已刪除行的日志記錄仍將占用日志或日志備份中的空間。

如果能夠使使用此系統的正常情況下的任何內容脫機,並且要保留的行數與要刪除的行相比顯得相形見,,則可能需要復制這些行以保存到另一個表中,請刪除所有鍵,截斷表,將保留的行復制回並重建外鍵。 YMMV。

將恢復模式更改為簡單的數據庫,進行更新/刪除,然后再更改回先前的恢復模式。

由於您的數據庫正在簡單恢復中,因此出現腳本問題

CHECKPOINT 1;

在每N次迭代之后使用命令來釋放日志。

在簡單恢復模式下,如果日志已滿70%,則自動檢查點將排隊。 在db屬性中限制最大日志文件大小將防止日志文件超出范圍。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM