【问题标题】:Query to delete data before 90 days in 100-100 batches查询100-100批次删除90天前的数据
【发布时间】:2022-01-27 14:58:43
【问题描述】:
DECLARE @DELETED_ROWS INT;
SET @DELETED_ROWS = 100

WHILE (@DELETED_ROWS > 0)
BEGIN
    WITH cte AS
    (
         SELECT
             DATEADD(DAY, -90, UPDATEDDATE) AS date, audit_id 
         FROM
             auditdata 
    ) 
    DELETE TOP (100) 
    FROM cte 
    WHERE audit_id <= (SELECT MIN(audit_id) + 100 FROM cte) 

    SET @DELETED_ROWS = @@ROWCOUNT
END

【问题讨论】:

  • 这将通过上述查询被删除,但是从性能方面来说它需要花费太多时间来执行。有人可以帮我优化此查询或任何其他查询以获得更好的性能
  • 请使用 while 循环帮助我。我们正在删除日期列上的数据,我们没有索引需要在 audit_ID 列上删除。
  • 每次循环删除多少行
  • 100-100批次
  • edit你的cmets进入问题,因为目前没有问题。

标签: sql sql-server tsql


【解决方案1】:

因此,您将删除分成多个批次。
然后你可能想要提交批处理事务。

并且删除语句可以简化。

SET NOCOUNT ON;
 
DECLARE @DELETED_ROWS INT = 1;
 
WHILE @DELETED_ROWS > 0
BEGIN
  BEGIN TRANSACTION;
 
  DELETE TOP (100)
  FROM auditdata
  WHERE UPDATEDDATE < DATEADD(DAY, -90, GetDate());
 
  SET @DELETED_ROWS = @@ROWCOUNT;
 
  COMMIT TRANSACTION;
END;

【讨论】:

  • 对于单个DELETE,使用BEGIN COMMIT 毫无意义。在每个事务中,只有一个 DELETE 正在执行
【解决方案2】:
DECLARE @Rows INT = 100
WHILE (@Rows=100)
BEGIN
    DELETE TOP (100)
    FROM auditdata
    WHERE 
        UPDATEDDATE<DATEADD(DAY,-90, GETDATE())
    
     SET @Rows = @@ROWCOUNT
    
 END

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2012-11-07
    • 2019-09-14
    • 2021-03-10
    • 1970-01-01
    • 2022-06-28
    • 1970-01-01
    • 1970-01-01
    • 2021-03-03
    相关资源
    最近更新 更多