Tôi phải xóa hơn 16 triệu bản ghi khỏi bảng hàng hơn 221 triệu và nó đang diễn ra cực kỳ chậm.
Tôi đánh giá cao nếu bạn chia sẻ đề xuất để tạo mã dưới đây nhanh hơn:
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
Kế hoạch thực hiện (giới hạn trong 2 lần lặp)
VendorId
là PK và không được phân cụm , trong đó chỉ mục được phân cụm không được sử dụng bởi tập lệnh này. Có 5 chỉ mục không duy nhất, không phân cụm khác.
Nhiệm vụ là "loại bỏ các nhà cung cấp không tồn tại trong một bảng khác" và sao lưu chúng vào một bảng khác. Tôi có 3 bàn vendors, SpecialVendors, SpecialVendorBackups
. Cố gắng loại bỏ SpecialVendors
những thứ không tồn tại trong Vendors
bảng và để sao lưu các bản ghi bị xóa trong trường hợp những gì tôi đang làm là sai và tôi phải đặt lại chúng trong một hoặc hai tuần.