कई रिकॉर्ड्स वाले किसी तालिका में न्यूल कॉलम जोड़ने के लिए, एक डिफॉल्ट बाधा लागू करने की आवश्यकता है। यह बाधा पूरी ALTER तालिका कमांड को चलाने के लिए लंबे समय तक ले जाती है यदि तालिका बहुत बड़ी है।SQL सर्वर में एक बड़ी तालिका में आप एक न्यूल कॉलम कैसे जोड़ते हैं?
अनुमान:
- डिफ़ॉल्ट बाधा मौजूदा रिकॉर्ड को संशोधित करता है इसका कारण यह है है। इसका मतलब है कि डीबी को प्रत्येक रिकॉर्ड के आकार में वृद्धि करने की आवश्यकता होती है, जिसके कारण यह डेटा डेटा को अन्य डेटा-पेजों पर स्थानांतरित कर देता है और इसमें समय लगता है।
- DEFAULT अद्यतन परमाणु लेनदेन के रूप में निष्पादित करता है। इसका मतलब है कि लेनदेन लॉग को उगाया जाना चाहिए ताकि यदि आवश्यक हो तो रोल-बैक निष्पादित किया जा सकता है।
- लेनदेन लॉग पूरे रिकॉर्ड का ट्रैक रखता है। इसलिए, भले ही केवल एक ही क्षेत्र में संशोधन किया गया हो, फिर भी लॉग द्वारा आवश्यक स्थान पूरे रिकॉर्ड के आकार पर आधारित होगा जो मौजूदा रिकॉर्ड के # द्वारा गुणा किया गया है। इसका मतलब यह है कि छोटे रिकॉर्ड वाले टेबल पर एक कॉलम जोड़ना बड़े रिकॉर्ड वाले तालिका में कॉलम जोड़ने से तेज़ होगा, भले ही रिकॉर्ड्स की कुल # दोनों टेबल के लिए समान हों।
संभावित समाधान:
- यह चूसो अप और प्रक्रिया को पूरा करने के लिए प्रतीक्षा करें। बस समय सीमा अवधि बहुत लंबे समय तक सेट करना सुनिश्चित करें। इसके साथ समस्या यह है कि रिकॉर्ड के # के आधार पर इसे करने में घंटों या दिन लग सकते हैं।
- कॉलम जोड़ें लेकिन न्यूल को अनुमति दें। इसके बाद, मौजूदा पंक्तियों के लिए DEFAULT मान सेट करने के लिए एक अद्यतन क्वेरी चलाएं। अपडेट न करें *। एक समय में रिकॉर्ड के बैच अपडेट करें या आप समाधान # 1 के समान समस्या के साथ समाप्त हो जाएंगे। इस दृष्टिकोण के साथ समस्या यह है कि आप एक कॉलम के साथ समाप्त होते हैं जो NULL को अनुमति देता है जब आप जानते हैं कि यह एक अनावश्यक विकल्प है। मेरा मानना है कि वहां कुछ बेहतरीन अभ्यास दस्तावेज हैं जो कहते हैं कि आपके पास ऐसे कॉलम नहीं होने चाहिए जो शून्य होने की अनुमति न दें जब तक कि यह आवश्यक न हो।
- उसी स्कीमा के साथ एक नई तालिका बनाएं। उस स्कीमा में कॉलम जोड़ें। मूल तालिका से डेटा को स्थानांतरित करें। मूल तालिका ड्रॉप करें और नई तालिका का नाम बदलें। मुझे यकीन नहीं है कि यह # 1 से बेहतर कैसे है।
सवाल:
- मेरी मान्यताओं सही हैं?
- क्या ये मेरे एकमात्र समाधान हैं? यदि हां, तो कौन सा सबसे अच्छा है? मैं नहीं, मैं और क्या कर सकता था?
मुझे नहीं पता था कि आप गो के बाद एक नंबर डाल सकते हैं। आपने मेरी दुनिया बदल दी है –
यह उल्लेखनीय है कि एमएसडीएन दृढ़ता से 'NOCHECK' का उपयोग करके हतोत्साहित करता है:" यदि आप मौजूदा डेटा के खिलाफ नई जांच या विदेशी कुंजी बाधाओं को सत्यापित नहीं करना चाहते हैं, तो NOCHECK के साथ उपयोग करें। हम दुर्लभ मामलों को छोड़कर ऐसा करने की अनुशंसा नहीं करते हैं। नया सभी बाद के डेटा अपडेट में बाधा का मूल्यांकन किया जाएगा। किसी भी बाधा उल्लंघन जो कि जब भी बाधा डाली जाती है तो NOCHECK द्वारा दबाए जाते हैं, तो भविष्य में अपडेट विफल हो सकते हैं यदि वे डेटा के साथ पंक्तियों को अपडेट करते हैं जो बाधा का पालन नहीं करते हैं। " –
इसके अलावा: "क्वेरी ऑप्टिमाइज़र उनको बाधाओं पर विचार नहीं करता है जिन्हें NOCHECK के साथ परिभाषित किया गया है। इस तरह की बाधाओं को तब तक अनदेखा कर दिया जाता है जब तक कि वे सभी चेक कंसस्ट्रेंट के साथ ALTER तालिका
मुझे लगता है कि यह आपके द्वारा उपयोग किए जा रहे एसक्यूएल स्वाद पर निर्भर करता है, लेकिन यदि आपने विकल्प 2 लिया है, तो अंत में तालिका तालिका को डिफ़ॉल्ट मान के साथ शून्य नहीं करने के लिए बदलें?
क्या यह तेज़ होगा, क्योंकि यह देखता है कि सभी मान शून्य नहीं हैं?
स्रोत
2008-11-13 19:33:54 Pyrolistical
तालिका को लंबवत रूप से विभाजित करें। इसका मतलब है कि आपके पास दो प्राथमिक तालिकाएं होंगी, वही प्राथमिक कुंजी के साथ, और रिकॉर्ड्स की एक ही संख्या होगी ... एक आपके पास पहले से ही होगा, दूसरे के पास केवल कुंजी होगी, और नया गैर-शून्य कॉलम होगा डिफ़ॉल्ट मान) । सभी को सम्मिलित करें, अपडेट करें और कोड हटाएं ताकि वे दो तालिकाओं को synch में रख सकें ... यदि आप चाहते हैं कि आप एक दृश्य बना सकें जो दोनों तालिकाओं को एक साथ जोड़ता है जो कि दो जैसा दिखता है ग्राहक के लिए एकल तालिका कथन का चयन करें ...
स्रोत
2008-11-13 19:34:04
क्या आपका मतलब लंबवत है? –
आह हाँ, एक टी याद किया ... दुर्भाग्य से मैं एक 2 उंगली typer ... –
यह एक बहुत ही खतरनाक समाधान की तरह लगता है। यह सही तरीका है। यदि आप इस समाधान का प्रयास करते हैं, तो दो टेबलों में शामिल होने वाला नया दृश्य मूल तालिका का नाम होना चाहिए (इसलिए कोई क्लाइंट कोड बदलने की आवश्यकता नहीं है)। – rmeador
यहाँ मैं क्या कोशिश करेगा है:
सिंपल रिकवरी मॉडल का उपयोग लॉगिंग को रोकता नहीं है, लेकिन यह इसके प्रभाव को काफी कम करता है। ऐसा इसलिए है क्योंकि प्रत्येक प्रतिबद्धता के बाद सर्वर रिकवरी जानकारी को त्याग देता है।
स्रोत
2008-11-13 20:08:12 RoadWarrior
तालिका के आकार के आधार पर, सुनिश्चित करें कि आपके पास पर्याप्त लॉग स्थान है। कॉलम को रीसेट करने के लिए अब नल की अनुमति नहीं है लॉग गहन है। – Lamar
मैं अद्यतन के बजाय CURSOR का उपयोग करूंगा। कर्सर बैच में सभी मिलान रिकॉर्ड अपडेट करेगा, रिकॉर्ड द्वारा रिकॉर्ड - इसमें समय लगता है लेकिन ताले टेबल नहीं।
यदि आप ताले से बचने के लिए WAIT का उपयोग करना चाहते हैं।
मुझे भी यकीन नहीं है कि डिफॉल्ट मौजूदा पंक्तियों को बाधित करता है। संभवतः लेखक द्वारा वर्णित केस के कारण DEFAULT के साथ एक साथ उपयोग को सीमित नहीं किया जाता है।
यह बदलता है, तो अंत में जोड़ सकते हैं ताकि स्यूडोकोड दिखेगा की तरह:
मुझे यकीन है कि कुछ वाक्यविन्यास त्रुटियों देखते हैं कि हूँ, लेकिन मुझे आशा है कि इस मदद अपनी समस्या को हल करने के लिए।
शुभकामनाएं!
स्रोत
2008-11-13 23:15:33
यदि आप एक ही तालिका में कॉलम चाहते हैं, तो आपको बस इसे करना होगा। अब, विकल्प 3 संभावित रूप से इसके लिए सबसे अच्छा है क्योंकि इस ऑपरेशन के दौरान आपके पास अभी भी डेटाबेस "लाइव" हो सकता है। यदि आप विकल्प 1 का उपयोग करते हैं, तो ऑपरेशन होने पर तालिका लॉक हो जाती है और फिर आप वास्तव में अटक जाते हैं।
यदि आपको तालिका में कॉलम है तो वास्तव में परवाह नहीं है, तो मुझे लगता है कि एक खंडित दृष्टिकोण अगली सबसे अच्छी है। हालांकि, मैं वास्तव में उस से बचने की कोशिश करता हूं (इस बिंदु पर कि मैं ऐसा नहीं करता) क्योंकि चार्ल्स ब्रेताना की तरह, आपको यह सुनिश्चित करना होगा कि उन सभी स्थानों को अपडेट/डालें जो उस तालिका को अपडेट/डालें और संशोधित करें। ओह!
स्रोत
2008-11-13 23:22:56
आप कर सकते हैं:
इस दृष्टिकोण का लाभ यह है कि आपके पाठक लंबी प्रक्रिया के दौरान तालिका तक पहुंचने में सक्षम होंगे और आप पृष्ठभूमि में किसी प्रकार का स्कीमा परिवर्तन कर सकते हैं।
स्रोत
2008-11-14 00:07:21
मुझे एक ही समस्या थी, और आपके विकल्प # 2 के लिए चला गया। इस तरह से 20 मिनट लगते हैं, 32 घंटे के विपरीत दूसरी तरह !!! भारी अंतर, टिप के लिए धन्यवाद। मैं इसके बारे में एक पूर्ण ब्लॉग प्रविष्टि लिखा था, लेकिन यहां महत्वपूर्ण एसक्यूएल है:
और ब्लॉग प्रविष्टि यदि आप रुचि रखते हैं: http://splinter.com.au/adding-a-column-to-a-massive-sql-server-table
स्रोत
2009-03-16 03:13:18 Chris
बस नवीनतम जानकारी के साथ इसे अपडेट करने के लिए।
SQL सर्वर 2012 इस में अब
पल के लिए होना चाहिए आवश्यकता उदाहरण एक शाब्दिक स्थिर या
GETDATE()
जैसे फ़ंक्शन हो सकते हैं जो सभी पंक्तियों के लिए समान मान का मूल्यांकन करता है।NEWID()
का डिफ़ॉल्ट योग्य नहीं है और फिर भी वहां और फिर सभी पंक्तियों को अद्यतन करने के समाप्त हो जाएगा।SQL सर्वर अर्हता प्राप्त करने वाले डिफ़ॉल्ट के लिए उन्हें मूल्यांकन करता है और परिणाम मेटाडेटा में डिफ़ॉल्ट मान के रूप में संग्रहीत करता है, इसलिए यह डिफ़ॉल्ट बाधा से उत्पन्न होता है (जिसे अब आवश्यक नहीं किया जा सकता है)। यह
sys.system_internals_partition_columns
में देखने योग्य है। जब तक वे अद्यतन होने के लिए अगली बार तक पंक्तियों तक मूल्य नहीं लिखे जाते हैं।अधिक यह यहाँ के बारे में विवरण: online non-null with values column add in sql server 2012
स्रोत
2013-01-07 11:10:09
मैं एक ऐसी ही समस्या थी और मैं संशोधित # 3 दृष्टिकोण के साथ चला गया। मेरे मामले में डेटाबेस सरल पुनर्प्राप्ति मोड में था और जिस तालिका को कॉलम जोड़ा जाना था उसे किसी भी एफके बाधाओं से संदर्भित नहीं किया गया था।
एक ही स्कीमा के साथ एक नई तालिका बनाने और मूल तालिका की सामग्री की प्रतिलिपि बनाने के बजाय, मैंने चयन किया ... वाक्यविन्यास में।
माइक्रोसॉफ्ट (http://technet.microsoft.com/en-us/library/ms188029(v=sql.105).aspx)
कदम के अनुक्रम:
1.Move डिफ़ॉल्ट
2.Drop वर्ष तालिका
3 के साथ नया स्तंभ जोड़ने नया करने के लिए पुराने तालिका से डेटा जबकि .नाम नव निर्मित तालिका
नई तालिकामेरे मामले में तालिका 100 मिलियन से अधिक पंक्तियों था पर 0
4.Create आवश्यक की कमी और अनुक्रमित और इस दृष्टिकोण तेजी से दृष्टिकोण # 2 की तुलना में पूरी की और लोग इन अंतरिक्ष विकास कम से कम था।
स्रोत
2013-10-02 15:59:33
क्या आपको नई छाया तालिका पर सभी एफके की बाधाओं को भी बनाने की ज़रूरत है? – Junto
चुनें INTO स्वचालित रूप से प्रलेखन https://msdn.microsoft.com/en-us/library/ms188029.aspx अनुभाग "सीमाएं और प्रतिबंध" के अनुसार FK बाधाओं को नहीं बनाएगा। उन्हें मैन्युअल रूप से जोड़ा जाना है। –
स्वीकार किया गया कि यह एक पुराना सवाल है। मेरे सहयोगी ने हाल ही में मुझे बताया कि वह 13.6 एम पंक्तियों वाली तालिका में एक ही तालिका तालिका विवरण में इसे करने में सक्षम था। यह SQL Server 2012 में एक सेकंड के भीतर समाप्त हुआ। मैं 8 एम पंक्तियों वाली तालिका पर इसकी पुष्टि करने में सक्षम था। एसक्यूएल सर्वर के बाद के संस्करण में कुछ बदल गया?
स्रोत
2015-05-25 18:01:46
1) एक डिफ़ॉल्ट मान के साथ तालिका में कॉलम जोड़ें:
2) मान अद्यतन संवर्द्धित स्वीकार किए जाते हैं जवाब के रूप में तालिका (एक ही प्रभाव में)। अन्य उपयोगकर्ताओं/प्रक्रियाओं को अवरुद्ध करने से बचने के लिए, अपने पर्यावरण में अपडेट किए जा रहे रिकॉर्ड की संख्या समायोजित करें।
3) कॉलम परिभाषा को शून्य की आवश्यकता के लिए बदलें। एक पल में निम्न को चलाएं जब तालिका उपयोग में नहीं है (या डाउनटाइम के कुछ मिनट शेड्यूल करें)। मैंने सफलतापूर्वक लाखों अभिलेखों के साथ तालिकाओं के लिए इसका उपयोग किया है।
स्रोत
2016-11-11 17:03:01 hobbsenigma
संबंधित मुद्दे