【问题标题】:Purge by deleting all records older than 180 days from the current date in SQL Server通过从 SQL Server 中的当前日期删除超过 180 天的所有记录来清除
【发布时间】: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?标准?企业?

标签: sql sql-server sql-delete


【解决方案1】:

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

  • 从备份开始(你永远不知道)
  • 将要保留的行插入到临时表中(确保磁盘上有足够的空间用于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;

【讨论】:

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

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

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

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

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

【讨论】:

    【解决方案3】:

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

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

    【讨论】:

      猜你喜欢
      • 2020-07-15
      • 2019-05-19
      • 1970-01-01
      • 2011-05-20
      • 2018-08-24
      • 1970-01-01
      • 1970-01-01
      • 2022-07-06
      • 2010-12-08
      相关资源
      最近更新 更多