221+ 백만 행 테이블에서 16 + 백만 레코드를 삭제해야하며 매우 느리게 진행됩니다.
아래 코드를 더 빠르게 만들기 위해 제안을 공유하면 감사합니다.
SET TRANSACTION ISOLATION LEVEL READ COMMITTED;
DECLARE @BATCHSIZE INT,
@ITERATION INT,
@TOTALROWS INT,
@MSG VARCHAR(500);
SET DEADLOCK_PRIORITY LOW;
SET @BATCHSIZE = 4500;
SET @ITERATION = 0;
SET @TOTALROWS = 0;
BEGIN TRY
BEGIN TRANSACTION;
WHILE @BATCHSIZE > 0
BEGIN
DELETE TOP (@BATCHSIZE) FROM MySourceTable
OUTPUT DELETED.*
INTO MyBackupTable
WHERE NOT EXISTS (
SELECT NULL AS Empty
FROM dbo.vendor AS v
WHERE VendorId = v.Id
);
SET @BATCHSIZE = @@ROWCOUNT;
SET @ITERATION = @ITERATION + 1;
SET @TOTALROWS = @TOTALROWS + @BATCHSIZE;
SET @MSG = CAST(GETDATE() AS VARCHAR) + ' Iteration: ' + CAST(@ITERATION AS VARCHAR) + ' Total deletes:' + CAST(@TOTALROWS AS VARCHAR) + ' Next Batch size:' + CAST(@BATCHSIZE AS VARCHAR);
PRINT @MSG;
COMMIT TRANSACTION;
CHECKPOINT;
END;
END TRY
BEGIN CATCH
IF @@ERROR <> 0
AND @@TRANCOUNT > 0
BEGIN
PRINT 'There is an error occured. The database update failed.';
ROLLBACK TRANSACTION;
END;
END CATCH;
GO
실행 계획 (2 회 반복으로 제한)
VendorId
이다 PK 와 클러스터되지 않은 경우, 클러스터 된 인덱스는 이 스크립트에 의해 사용되지 않습니다. 5 개의 다른 고유하지 않은 클러스터되지 않은 인덱스가 있습니다.
작업은 "다른 테이블에 존재하지 않는 공급 업체를 제거"하고 다른 테이블에 백업하는 것입니다. 3 개의 테이블이 vendors, SpecialVendors, SpecialVendorBackups
있습니다. 테이블에 SpecialVendors
존재하지 않는 것을 제거 Vendors
하고 내가하고있는 일이 잘못되어 삭제 된 레코드를 백업하려고하면 1 ~ 2 주 안에 다시 넣어야합니다.