[英]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.