मैं न्यूनतम डाउनटाइम वाली बड़ी तालिका में एक पंक्ति पंक्ति स्तंभ कैसे जोड़ सकता हूं


21

SQL Server 2008 और बाद में का उपयोग करते हुए, मैं एक बड़ी तालिका में एक पंक्ति-पंक्ति स्तंभ जोड़ना चाहता हूं, हालांकि जब मैं बस

ALTER TABLE [Tablename]
ADD Rowversion [Rowversion] NOT NULL

फिर तालिका बहुत लंबे समय तक अपडेट के लिए अनुपलब्ध है।

इस डाउनटाइम को कम करने के लिए मैं किन रणनीतियों का उपयोग कर सकता हूं? मैं कुछ भी विचार करूंगा। बेशक बेहतर है, लेकिन मैं किसी भी रणनीति पर विचार करूंगा।

मेरी सोच यह है कि अंतिम उपाय के रूप में, मैं ट्रिगर्स द्वारा बनाए गए एक कॉपी स्टेजिंग टेबल को बनाए रख सकता हूं और फिर स्टेजिंग टेबल को मूल तालिका में बदल सकता हूं। लेकिन मैं कुछ आसान / आसान करने की उम्मीद कर रहा हूं।

जवाबों:


26

समान स्कीमा प्लस रोवरवर्जन कॉलम के साथ एक नई तालिका बनाने पर विचार करें, और दोनों तालिकाओं के बीच एक दृश्य जोड़ें जो एक संघ करता है। क्या लोग दृश्य का उपयोग करते हैं, और इसके बजाय अंतर्निहित तालिकाओं और विचारों के विरुद्ध ट्रिगर लिखते हैं।

आवेषण को नई तालिका में भेजा जाना चाहिए, अपडेट को नई तालिका में डेटा स्थानांतरित करना चाहिए, और हटाए जाने पर दोनों तालिकाओं पर लागू किया जाना चाहिए।

फिर बैकग्राउंड में बैच मूव्स करते हैं, एक बार में कई रिकॉर्ड्स को घुमाते हुए जैसे आप नई टेबल पर जा सकते हैं। जब यह चल रहा हो तब भी आप समसामयिक मुद्दे रख सकते हैं, और कुछ लब्धप्रतिष्ठित निष्पादन योजनाएँ, लेकिन यह आपको ऑनलाइन रहने देता है जबकि चालें हो रही हैं।

आदर्श रूप से, आप अंतिम उपयोगकर्ताओं पर प्रभाव को कम करने के लिए शुक्रवार दोपहर को प्रक्रिया शुरू करते हैं, और सोमवार सुबह से पहले इसे करने की कोशिश करते हैं। एक बार इसकी जगह पर, आप केवल नई तालिका को इंगित करने के लिए दृश्य को बदल सकते हैं, और दीप्तिमान निष्पादन योजनाएं चली जाती हैं। आदर्श रूप में।

जब डेटा को बैचों में माइग्रेट किया जा रहा है, तो ट्रिगर फायरिंग से बचने के लिए, ट्रिगर में हटाए गए / सम्मिलित तालिकाओं में पंक्तियों की संख्या देखें और यदि वे आपके बैच में पंक्तियों की संख्या के निकट हैं तो गतिविधियों को छोड़ दें।


अंत में, माइकल ने अधिक स्थिर योजनाओं को प्राप्त करने के लिए दृश्य (और मूल तालिका से हटा नहीं) को छोड़ने का फैसला किया। व्यापार बंद तालिका की दो प्रतियां अनिवार्य रूप से पकड़ रहा था। उन्होंने इसे ब्लॉग पोस्टों की एक श्रृंखला में बदल दिया ।


7

यदि आपके पास आगे की योजना बनाने का समय है, तो बहुत आसान समाधान है ... (आमतौर पर)

स्टोरेज लेयर पर पेज स्प्लिट्स के कारण लंबे ताले लगभग निश्चित रूप से हैं। इसलिए उन्हें अपने समय पर मजबूर करें।

  1. डेटाटाइप के साथ एक NULL-सक्षम अस्थायी कॉलम जोड़ें VARBINARY(8)
  2. क्षेत्र के लिए एक वैध मूल्य के साथ मौजूदा रिकॉर्ड के बैचों को अद्यतन करने के लिए डेटाबेस में उपलब्ध सुस्त समय का पता लगाएं। ( 0x0000000027F95A5Bउदाहरण के लिए)
  3. अद्यतन आवश्यक पृष्ठ विभाजन को बाध्य करेंगे और तालिका में अधिक स्थान आवंटित करेंगे।
  4. जब आप पकड़े जाते हैं, तो अस्थायी कॉलम को छोड़ें (आवंटित भंडारण को स्पर्श न करें) और रोवर्सन कॉलम जोड़ें।
  5. कोई पृष्ठ विभाजित नहीं होता है, और मानों को आबाद करने के लिए केवल लंबे समय तक लॉक की आवश्यकता होती है।

मैंने इसे सफलतापूर्वक 10 मिनट के भीतर 150M पंक्ति तालिका में एक पंक्ति-पंक्ति स्तंभ जोड़ने के लिए उपयोग किया है।

कैविएट ... यदि आपके पास बड़े वर्चर फ़ील्ड (विशेष रूप से varchar(max)) SQL सर्वर के साथ एक तालिका है , तो नए उपलब्ध स्थान का फिर से उपयोग करने के बजाय तालिका के पुनर्निर्माण का फैसला करता है। फिर भी उस एक तरीके का पता लगाने की कोशिश की जा रही है।


दिलचस्प है, मुझे लगता है कि मैंने अपने प्रश्न में "बहुत लंबा" क्या निर्दिष्ट नहीं किया है। यदि आपके परिदृश्य के लिए> 30 मिनट बहुत लंबा है और 10 मिनट सहन करने योग्य है, तो यह समाधान काम करेगा। मेरे परिदृश्य में शून्य डाउनटाइम या अधिक विशेष रूप से <10 सेकंड को प्राप्त करने की कोशिश करना शामिल था जो ब्रेंट के उत्तर द्वारा प्राप्त किया गया है।
माइकल जे। स्वार्ट

1

यदि TIMESTAMPआप जोड़ रहे हैं NULLABLE:

  1. एक VARBINARY(8)कॉलम जोड़ें
  2. डेटा के साथ आबाद करें।

इसके बाद पॉपुलेटेड, बैक टू बैक SQL स्टेटमेंट्स में, DROPजो VARBINARY(8)कॉलम आपने अभी जोड़ा और पॉप्युलेट किया, और TIMESTAMP NULLकॉलम ऐड किया ।


यदि TIMESTAMPआप जोड़ रहे हैं NOT NULLABLE:

  1. एक जोड़ें BINARY(8)कॉलम
  2. डेटा के साथ आबाद करें।

इसके बाद पॉपुलेटेड, बैक टू बैक एसक्यूएल स्टेटमेंट्स, आपके द्वारा जोड़े DROPगए BINARY(8)कॉलम और पॉपुलेटेड और ADD THE TIMESTAMP NOT NULLकॉलम।

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.