通过删除 SQL 服务器中从当前日期起超过 180 天的所有记录来清除

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

在 SQL Server 2008 R2 中,我有一个 table(数据库大小为 450 GB),其中包含超过 10 亿行,我想通过删除超过 180 天的所有记录来清除这些记录从当前日期算起。这里的任何帮助将不胜感激!

我正在使用以下查询:

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

但是它花费了太多时间。是否有任何维护计划或任何查询,以便我可以快速删除数据?

是的。当你想定期删除旧的记录时,正确的方法是使用分区。

这是一个很大的话题。您可以通过 documentation.

开始了解它

关键思想是每个分区都是一个单独的数据存储区。可以在不记录的情况下删除整个分区,从而产生非常小的开销。

对于你的情况,我可能会建议每个月单独分区。

这需要很长时间,因为(部分)所有这些删除都将进入一个庞大的事务。您需要将其分解为更小的块(事务)并定期提交。它仍然需要很长时间,但对您的服务器的影响会减少。参见 and the blog post it references, 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

如果您的 table 是分区的,它会更容易和更快。

一种可能会节省您一些时间的方法:

  • 从备份开始(你永远不知道)
  • 将要保留的行插入临时文件 table(确保磁盘上有足够的空间用于 tempdb
  • TRUNCATE table 快速删除所有行(这条语句会立即执行)
  • 将临时 table 中的行插入到您的源中 table

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;