Sqlserver
 sql >> डेटाबेस >  >> RDS >> Sqlserver

SQL सर्वर में 1 लाख पंक्तियों को हटाना

जैसा कि ऊपर सुझाव दिया गया है, यहां एक बैच हटाने के लिए एक संरचना है। एक बार में 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


  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. अल्फा कॉलम के लिए एएससी/डीईएससी द्वारा सशर्त एसक्यूएल ऑर्डर

  2. क्लस्टर्ड और नॉनक्लस्टर इंडेक्स के बीच अंतर

  3. समय अवधि का उपयोग करके समान मान की लगातार पंक्तियों को समूहित करें

  4. SQL सर्वर में, मैं किसी दी गई तालिका के लिए CREATE TABLE स्टेटमेंट कैसे जेनरेट करूं?

  5. Sql 2008 डेवलपर Sql Azure माइग्रेशन के लिए