मुझे 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
तालिका में मौजूद नहीं है, उसे हटाने की कोशिश कर रहा हूं और जो मैं कर रहा हूं उसके मामले में हटाए गए रिकॉर्ड का बैकअप लेने के लिए और मुझे उन्हें एक या दो सप्ताह में वापस लाना होगा।