簡體   English   中英

通過刪除SQL Server中當前日期之前180天以上的所有記錄進行清除

[英]Purge by deleting all records older than 180 days from the current date in SQL Server

在此輸入圖像描述

在SQL Server 2008 R2中,我有一個表(數據庫大小為450 GB),行數超過十億,我想通過刪除從當前日期算起的所有180天以上的記錄來清除這些行。 任何幫助在這里將不勝感激!

我正在使用以下查詢:

DELETE FROM table name 
WHERE column name < '2015-01-01' 

但這花費了太多時間。 是否有任何維護計划或任何查詢,以便我可以快速刪除數據?

是。 如果要定期刪除舊的記錄,那么正確的方法是使用分區。

這是一個很大的話題。 您可以通過文檔開始了解它。

關鍵的想法是每個分區都是一個單獨的數據存儲。 可以在不進行日志記錄的情況下刪除整個分區,從而產生很少的開銷。

在您的情況下,我可能建議每個月單獨分區。

這需要很長時間,因為(部分)所有這些刪除都會進入一個巨大的交易。 您需要將其分解為更小的塊(事務)並定期提交。 它仍然需要很長時間,但對服務器的影響將會減少。 請參閱https://stackoverflow.com/a/28324562/1324345及其引用的博客文章, http://sqlperformance.com/2013/03/io-subsystem/chunk-deletes

SET NOCOUNT ON;

DECLARE @r INT;

SET @r = 1;

WHILE @r > 0
BEGIN
  BEGIN TRANSACTION;

  DELETE TOP (100000) -- this will change
    table
    WHERE column name < '2015-01-01' ;

  SET @r = @@ROWCOUNT;

  COMMIT TRANSACTION;

  -- CHECKPOINT;    -- if simple
  -- BACKUP LOG ... -- if full
END

如果您的表是分區的,它可以更容易,更快。

一種可能為您節省時間的方法:

  • 從備份開始(你永遠不知道)
  • 將要保留的行插入臨時表(確保磁盤上有足夠的空間用於tempdb
  • TRUNCATE表快速刪除所有行(此語句將立即執行)
  • 將臨時表中的行插回源表

INSERT INTO #keep SELECT * FROM table_name WHERE column_name>='2015-01-01';
TRUNCATE TABLE table_name;
INSERT INTO table_name SELECT * FROM #keep;
DROP TABLE #keep;

暫無
暫無

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

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