ฉันต้องลบมากกว่า 16 ล้านระเบียนจากตารางแถว 221 ล้านและมันจะช้ามาก
ฉันขอขอบคุณถ้าคุณแบ่งปันคำแนะนำในการทำโค้ดด้านล่างให้เร็วขึ้น:
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
ตารางและมีการสำรองข้อมูลของระเบียนที่ถูกลบในกรณีที่สิ่งที่ฉันทำผิดและฉันต้องนำพวกเขากลับมาในหนึ่งหรือสองสัปดาห์