繁体   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