繁体   English   中英

批量删除格式正确吗?

[英]Batch deletion correctly formatted?

我有多个表,其中有数百万行。 为了安全起见,不会溢出事务日志,我一次要批量删除100,000行。 我必须首先根据日期过滤掉,然后删除少于某个日期的所有行。

为此,我在存储过程中创建了一个表,其中包含需要删除的行的ID:

然后,我插入该表并使用循环从所需表中删除行。 这似乎运行成功,但速度非常慢。 做得正确吗? 这是最快的方法吗?

DECLARE @FILL_ID_TABLE TABLE (
  FILL_ID varchar(16)
)

DECLARE @TODAYS_DATE date
SELECT
  @TODAYS_DATE = GETDATE()

--This deletes all data older than 2 weeks ago from today 
DECLARE @_DATE date
SET @_DATE = DATEADD(WEEK, -2, @TODAYS_DATE)

DECLARE @BatchSize int
SELECT
  @BatchSize = 100000


BEGIN TRAN FUTURE_TRAN
  BEGIN TRY

    INSERT INTO @FILL_ID_TABLE
      SELECT DISTINCT
        ID
      FROM dbo.ID_TABLE
      WHERE CREATED < @_DATE

    SELECT
      @BatchSize = 100000
    WHILE @BatchSize <> 0
    BEGIN
      DELETE TOP (@BatchSize) FROM TABLE1
      OUTPUT DELETED.* INTO dbo.TABLE1_ARCHIVE
      WHERE ID IN (SELECT
          ROLLUP_ID
        FROM @FILL_ID_TABLE)
      SET @BatchSize = @@rowcount
    END

    SELECT
      @BatchSize = 100000
    WHILE @BatchSize <> 0
    BEGIN
      DELETE TOP (@BatchSize) FROM TABLE2
      OUTPUT DELETED.* INTO dbo.TABLE2_ARCHIVE
      WHERE ID IN (SELECT
          FILL_ID
        FROM @FILL_ID_TABLE)
      SET @BatchSize = @@rowcount
    END

    PRINT 'Succeed'
  COMMIT TRANSACTION FUTURE_TRAN
END TRY
BEGIN CATCH
  PRINT 'Failed'
  ROLLBACK TRANSACTION FUTURE_TRAN
END CATCH

尝试加入而不是子查询

DELETE  TOP (@BatchSize) T1 
OUTPUT DELETED.* INTO dbo.TABLE1_ARCHIVE
FROM  TABLE1 AS T1
JOIN @FILL_ID_TABLE AS FIL ON FIL.ROLLUP_ID = T1.Id

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM