NON NULL के लिए बड़ी तालिका पर गति परिवर्तन स्तंभ बढ़ाएँ


12

मैंने हाल ही में एक तालिका में एक NULL-सक्षम बिट कॉलम जोड़ा है जिसमें 500 मिलियन पंक्तियाँ हैं। स्तंभ पर कोई डिफ़ॉल्ट नहीं है, हालांकि सभी आवेषण 0 या 1 के मान को निर्दिष्ट कर रहे हैं, और मैंने सभी मौजूदा पंक्तियों को (छोटे बैचों में पंक्तियों को अपडेट करते हुए) 0 या 1 को असाइन करने के लिए एक बार की दिनचर्या चलाई है। प्रत्येक पंक्ति में अब उस कॉलम में 0 या 1 होना चाहिए।

मैं बिट कॉलम को गैर-अशक्त बनाना चाहता हूं, लेकिन जब मैंने ऐसा करने की कोशिश की ALTER TABLE t1 ALTER COLUMN c1 bit not null, तो यह 3 मिनट के लिए चलना शुरू हो गया और मैंने इसे रोक दिया क्योंकि यह सभी रीडिंग को टेबल पर रोक रहा था और मुझे संदेह था कि इसे पूरा करने में एक लंबा समय लगने वाला था। । यह संभव है कि इसमें बहुत अधिक समय नहीं लगेगा लेकिन मैं बहुत अधिक अनुपलब्धता का जोखिम नहीं उठा सकता। रोलबैक में स्वयं 6 मिनट लगे।

क्या आपके पास कोई सुझाव है कि कैसे मैं कॉलम को बिना अशक्त बना सकता हूं, इसे पूरा करने के लिए संभावित घंटे लेने के बिना? इसके अतिरिक्त, इस बात का अनुमान लगाने का कोई तरीका है कि ALTER TABLE ALTER COLUMNमैंने कितने समय के लिए वक्तव्य शुरू किया और फिर रद्द कर दिया गया?

मैं SQL Server 2017 वेब संस्करण का उपयोग कर रहा हूं।

जवाबों:


12

कॉलम की परिभाषा बदलने के बजाय आप CHECK CONSTRAINTउस कॉलम के लिए NULLs की अनुमति नहीं दे सकते। तालिका को अभी भी स्कैन करने की आवश्यकता होगी, लेकिन इसे हर एक डेटा पृष्ठ को संशोधित करने की आवश्यकता नहीं होगी, इसलिए यह बहुत तेज संचालन होना चाहिए। अफसोस, ऑपरेशन के दौरान एक Sch-M लॉक अभी भी आयोजित किया जाएगा। एक चाल यह है कि बाधा को जोड़ने के प्रयास से पहले बफर पूल में तालिका के जितना संभव हो सके। उस समय Sch-M लॉक आयोजित होने की मात्रा कम हो सकती है।

फिर आप अपनी अगली रखरखाव विंडो के दौरान बाधा को हटा सकते हैं और स्तंभ परिभाषा बदल सकते हैं।


धन्यवाद जो विचार के लिए। मैं लगभग एक चेक बाधा जोड़ने के साथ गया था, लेकिन सप्ताहांत में एक रखरखाव खिड़की थी और कॉलम को गैर-अशक्त होने के लिए बदलने में सक्षम था। मुझे यकीन नहीं है कि अगर यह मदद करता है, लेकिन बफर पूल में टेबल डेटा प्राप्त करने के लिए प्रयास करें और कॉलम को गैर-अशक्त बनाने से पहले, मैं भाग गया, SELECT c1, count(*) FROM t1 GROUP BY c1जिसे चलाने में लगभग 9 मिनट लगे। इसके ALTER TABLE ALTER COLUMNबाद का वास्तविक विवरण पूरा होने में 25 मिनट का समय लगा। इतना भी बेकार नहीं।
बेन अमादा

11

यदि आप एंटरप्राइज एडिशन (ईई) पर हैं, तो NOT NULLएक डिफ़ॉल्ट 0या 1(जो भी सबसे आम है) के साथ एक बेहतर रणनीति हो सकती है ।

यह एक मेटाडेटा केवल ईई में परिवर्तन है । फिर फ़्लिप किए जाने की आवश्यकता वाले लोगों को अपडेट करें। इसका मतलब है कम अपडेट और समाप्त होने पर कॉलम की अशक्तता को बदलने की आवश्यकता नहीं है। - मार्टिन-स्मिथ


दिलचस्प बात यह है कि मैंने पिछले हफ्ते इस सुविधा को देखा था जब मैंने अपने स्थानीय मशीन पर एक समान बड़ी तालिका में एक गैर-अशक्त बिट कॉलम को जोड़ने का परीक्षण किया था जो SQL डेवलपर संस्करण चला रहा है - स्तंभ तुरन्त जोड़ा गया और मैं यह पता नहीं लगा सका कि क्यों । बाद में उसने मुझे बताया कि यह होना चाहिए क्योंकि डेवलपर संस्करण में ईई सुविधाएँ शामिल हैं।
बेन अमादा

-3

डेटा को किसी नई तालिका में कॉपी करने का प्रयास करें, फिर उसका नाम बदलें। आपको किसी भी अड़चन और सूचकांक का ध्यान रखना होगा। यह है कि जब आप कॉलम (उदाहरण के लिए) को फिर से व्यवस्थित करना चाहते हैं तो SSMS टेबल डिजाइनर क्या कर रहा है, लेकिन आपको यह देखने के लिए स्क्रिप्ट की जांच करनी चाहिए कि क्या ऐसा कुछ है जो सही नहीं दिखता है।

नकल के दौरान, स्रोत तालिका तक पहुंच को पढ़ना कोई समस्या नहीं है, लेकिन अगर कोई लिखता है तो उन्हें अलग-थलग स्तर के आधार पर अवरुद्ध या कॉपी नहीं किया जा सकता है।

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