जैसा कि ऊपर सुझाव दिया गया है, यहां एक बैच हटाने के लिए एक संरचना है। एक बार में 1M कोशिश न करें...
बैच का आकार और प्रतीक्षा के लिए विलंब स्पष्ट रूप से काफी परिवर्तनशील हैं, और यह आपके सर्वर क्षमताओं पर निर्भर करेगा, साथ ही विवाद को कम करने की आपकी आवश्यकता पर भी निर्भर करेगा। आपको कुछ पंक्तियों को मैन्युअल रूप से हटाने की आवश्यकता हो सकती है, यह मापने के लिए कि वे कितना समय लेते हैं, और अपने बैच आकार को उस चीज़ में समायोजित करें जिसे आपका सर्वर संभाल सकता है। जैसा कि ऊपर बताया गया है, 5000 से अधिक की कोई भी चीज़ लॉकिंग का कारण बन सकती है (जिसके बारे में मुझे जानकारी नहीं थी)।
यह घंटों के बाद सबसे अच्छा किया जाएगा ... लेकिन एसक्यूएल को संभालने के लिए 1 एम पंक्तियां वास्तव में बहुत कुछ नहीं हैं। यदि आप SSMS में अपने संदेश देखते हैं, तो प्रिंट आउटपुट प्रदर्शित होने में कुछ समय लग सकता है, लेकिन यह कई बैचों के बाद होगा, बस ध्यान रखें कि यह रीयल-टाइम में अपडेट नहीं होगा।
संपादित करें:स्टॉप टाइम जोड़ा गया @MAXRUNTIME
&@BSTOPATMAXTIME
. अगर आप @BSTOPATMAXTIME
. सेट करते हैं 1 से 1 तक, स्क्रिप्ट अपने आप ही वांछित समय, मान लीजिए 8:00 AM पर रुक जाएगी। इस तरह आप इसे रात में आधी रात को शुरू करने के लिए शेड्यूल कर सकते हैं, और यह सुबह 8 बजे उत्पादन से पहले बंद हो जाएगा।
संपादित करें:उत्तर बहुत लोकप्रिय है, इसलिए मैंने RAISERROR
जोड़ा है PRINT
. के बदले प्रति टिप्पणियों।
DECLARE @BATCHSIZE INT, @WAITFORVAL VARCHAR(8), @ITERATION INT, @TOTALROWS INT, @MAXRUNTIME VARCHAR(8), @BSTOPATMAXTIME BIT, @MSG VARCHAR(500)
SET DEADLOCK_PRIORITY LOW;
SET @BATCHSIZE = 4000
SET @WAITFORVAL = '00:00:10'
SET @MAXRUNTIME = '08:00:00' -- 8AM
SET @BSTOPATMAXTIME = 1 -- ENFORCE 8AM STOP TIME
SET @ITERATION = 0 -- LEAVE THIS
SET @TOTALROWS = 0 -- LEAVE THIS
WHILE @BATCHSIZE>0
BEGIN
-- IF @BSTOPATMAXTIME = 1, THEN WE'LL STOP THE WHOLE JOB AT A SET TIME...
IF CONVERT(VARCHAR(8),GETDATE(),108) >= @MAXRUNTIME AND @BSTOPATMAXTIME=1
BEGIN
RETURN
END
DELETE TOP(@BATCHSIZE)
FROM SOMETABLE
WHERE 1=2
SET @[email protected]@ROWCOUNT
SET @[email protected]+1
SET @[email protected][email protected]
SET @MSG = 'Iteration: ' + CAST(@ITERATION AS VARCHAR) + ' Total deletes:' + CAST(@TOTALROWS AS VARCHAR)
RAISERROR (@MSG, 0, 1) WITH NOWAIT
WAITFOR DELAY @WAITFORVAL
END