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

Posted

技术标签:

【中文标题】通过从 SQL Server 中的当前日期删除超过 180 天的所有记录来清除【英文标题】:Purge by deleting all records older than 180 days from the current date in SQL Server 【发布时间】:2016-02-05 16:50:27 【问题描述】:

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

我正在使用以下查询:

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

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

【问题讨论】:

超过 180 天的行的百分比有多大?也许将它们移动到不同的表,截断原始表并重命名表/将行复制回来更容易。否则,您可能希望批量删除较少数量的行 无论你最终做什么,无论如何都必须使用某种日期过滤,并最终花费相同的时间。虽然也许去另一个方向更快。将任何记录 &gt;= 2015-01-01 复制到另一个表,然后删除原始记录 - 特别是如果较新的记录只是整个十亿记录的一小部分。 亲爱的朋友们....在我的数据库中添加了图像行大小和数据大小。 什么版本的 SQL Server?标准?企业? 【参考方案1】:

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

从备份开始(你永远不知道) 将要保留的行插入到临时表中(确保磁盘上有足够的空间用于tempdbTRUNCATE表格快速删除所有行(该语句会立即执行) 将临时表中的行重新插入到源表中
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;

【讨论】:

感谢您的帮助.....但是这个系统日志,安全数据每天都在该数据库中。所以我们需要每天删除数据。 @ShivprasadWaychal 您可以每天安排在不必访问数据的时间。我回答了您问题的这一部分:“是否有任何 [...] 任何查询以便我可以快速删除数据?”。但我同意 Gordon 的回答,也许这会是一个更好的长期解决方案。 @ShivprasadWaychal 但回到我的答案。一旦您像我的回答一样以“快速方式”删除了整个历史记录,每天的删除将不再需要太多时间。您将安排每日删除查询 - 正常方式,简单的DELETE FROM your_table WHERE date_col&lt;DATEADD(DAY, -180, GETDATE())。如果日期列上有合适的 INDEX,则 DELETE 语句将不再花费太多时间。【参考方案2】:

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

这是一个很大的话题。您可以通过documentation开始了解它。

关键思想是每个分区都是数据的单独存储。无需记录即可删除整个分区,产生的开销非常小。

在您的情况下,我可能会建议每个月使用一个单独的分区。

【讨论】:

【参考方案3】:

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

如果你的表是分区的,它会更容易和更快。

【讨论】:

以上是关于通过从 SQL Server 中的当前日期删除超过 180 天的所有记录来清除的主要内容,如果未能解决你的问题,请参考以下文章

添加列通过从sql Server中的另一个表中选择所有项目来选择表

通过从 sql server 加入表来更新访问表

powershell 通过从文件名中删除“&”来重命名目录中的文件。

Ajax 不能通过从数据库中检索大文件来工作

通过从多个列中删除匹配的电子邮件域来过滤 Pandas 数据框

从 SQL Server 中的当前日期获取当前学年