আমাকে 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
এটি পিকে এবং নন-ক্লাস্টার্ড , যেখানে ক্লাস্টার্ড সূচকটি এই স্ক্রিপ্টটির দ্বারা ব্যবহৃত হয় না। এখানে 5 টি অন্যান্য অ-অনন্য, ক্লাস্টারযুক্ত সূচক নেই।
টাস্কটি হ'ল "বিক্রেতাদের অপসারণ যা অন্য টেবিলে বিদ্যমান নেই" এবং সেগুলি অন্য টেবিলে ব্যাক আপ করে। আমার কাছে 3 টেবিল রয়েছে vendors, SpecialVendors, SpecialVendorBackups
,। টেবিলের SpecialVendors
অস্তিত্ব নেই যা সরিয়ে দেওয়ার চেষ্টা করা হচ্ছে Vendors
, এবং আমি যা করছি তা ভুল হয়েছে এবং মুছে ফেলা রেকর্ডগুলির একটি ব্যাকআপ রাখার চেষ্টা করছি এবং আমি এক বা দুই সপ্তাহের মধ্যে তাদের ফিরিয়ে দিতে হবে।