2012-05-25 18 views
14

मेरे पास एक अरब पंक्तियों के साथ SQL Server 2008 R2 में एक तालिका है। मैं int से bigint तक दो कॉलम के डेटाटाइप को बदलना चाहता हूं। दो बार ALTER TABLE zzz ALTER COLUMN yyy काम करता है, लेकिन यह बहुत धीमा है। मैं प्रक्रिया को कैसे गति दे सकता हूं? मैं डेटा को दूसरी तालिका में कॉपी करने, ड्रॉप करने, बनाने, प्रतिलिपि बनाने और सरल पुनर्प्राप्ति मोड में स्विच करने या किसी भी तरह से एक कर्सर के साथ एक 1000 पंक्तियों में स्विच करने के बारे में सोच रहा था, लेकिन मुझे यकीन नहीं है कि क्या वे वास्तव में किसी भी सुधार का नेतृत्व करेंगे।एक विशाल तालिका में कॉलम प्रकार बदलें

+1

क्या आप समझा सकते हैं कि आप डेटा प्रकार को किस प्रकार से बदल रहे हैं? –

+1

मैं नहीं देख सकता कि कॉलम प्रकार बदलने के लिए आप कर्सर का उपयोग कैसे कर सकते हैं? एक कॉलम प्रकार किसी तालिका में _all_ मानों में परिवर्तन होता है। – Oded

+0

ints bigints – user1417408

उत्तर

26

आप जो परिवर्तन कर रहे हैं उसके आधार पर, कभी-कभी रखरखाव विंडो लेना आसान हो सकता है। उस खिड़की (जहां कोई भी तालिका में डेटा को बदलने में सक्षम होना चाहिए) के दौरान आप कर सकते हैं:

  1. बूंद किसी भी अनुक्रमित/बाधाओं वर्ष स्तंभ की ओर इशारा करते, और अक्षम चलाता
  2. एक नया नल स्तंभ जोड़ने नए डेटा प्रकार के साथ (भले ही यह शून्य न हो)
  3. पुराने कॉलम के मान के बराबर नई कॉलम सेटिंग अपडेट करें (और आप इसे व्यक्तिगत लेनदेन के टुकड़ों में कर सकते हैं (कहें, 10000 पंक्तियों को प्रभावित करना UPDATE TOP (10000) ... SET newcol = oldcol WHERE newcol IS NULL का उपयोग करके समय) और अपने लॉग को ओवरराइज करने से बचने के लिए चेकपॉइंट के साथ)
  4. एक बार अपडेट सब किया जाता है, पुराने कॉलम
  5. नया स्तंभ का नाम बदलने के ड्रॉप (और एक नहीं शून्य बाधा अगर उचित जोड़ने)
  6. अनुक्रमित और अद्यतन आंकड़ों के पुनर्निर्माण

कुंजी यहाँ है कि यह आप की अनुमति देता है चरण 3 में वृद्धि को अद्यतन करने के लिए, जिसे आप एकल ALTER तालिका कमांड में नहीं कर सकते हैं।

यह मानता है कि कॉलम डेटा अखंडता में एक प्रमुख भूमिका निभा रहा है - यदि यह विदेशी कुंजी संबंधों के समूह में शामिल है, तो और भी कदम हैं।

संपादित

इसके अलावा, और बस ज़ोर से सोच रहा है, मैं इस के लिए किसी भी परीक्षण नहीं किया है (लेकिन सूची में जोड़कर)। मुझे आश्चर्य है कि पेज + पंक्ति संपीड़न यहां मदद करेगा? यदि आप एक आईआईएन को बिगिनट में बदलते हैं, तो जगह में संपीड़न के साथ SQL सर्वर को अभी भी सभी मानों का इलाज करना चाहिए जैसे कि वे अभी भी एक आईएनटी में फिट हैं। दोबारा, मैंने परीक्षण नहीं किया है अगर यह तेजी से या धीमा हो जाएगा, या पहली जगह संपीड़न जोड़ने में कितना समय लगेगा। बस इसे बाहर फेंका जा रहा है।

+0

डीबी ऑफ़लाइन होगा। रिकवरी मॉडल को सरल मदद के लिए सेट कर देगा? – user1417408

+0

सरल या पूर्ण में, आपका विशाल वैकल्पिक तालिका कमांड अलग नहीं होगा, क्योंकि दोनों मामलों में पूरी चीज लॉग है। उपर्युक्त के साथ, सरल थोड़ा बेहतर हो सकता है, लेकिन यदि आप उपयुक्त बैच आकार चुनते हैं तो पुनर्प्राप्ति मॉडल से कोई फर्क नहीं पड़ता। इसके अलावा यदि डेटाबेस "ऑफलाइन" है (मुझे लगता है कि आप का मतलब नहीं है डाटाबेस ... सेट ऑफलाइन), गति क्यों मायने रखती है? उपरोक्त समय से कुछ प्रतिशत कम हो जाएगा, लेकिन यह दिमाग से तेजी से नहीं होगा। आप जो कर रहे हैं वह बस समय लेता है। –

+0

हारून, आपकी मदद के लिए धन्यवाद। गति मायने रखती है क्योंकि इस डीबी का उपयोग करने वाली साइट केवल कुछ घंटों के लिए ऑफ़लाइन होगी। – user1417408

-2

यदि आप SQL सर्वर प्रबंधन स्टूडियो जैसे कुछ का उपयोग कर रहे हैं तो आप डेटाबेस में तालिका पर जाएं, राइट-क्लिक करें, 'डिज़ाइन' चुनें और फिर उस कॉलम को चुनें जिसे आप संपादित करना चाहते हैं: इसे बिगिनट पर सेट करें और सहेजें दबाएं। पूरे कॉलम को बदलता है, लेकिन पिछले मान बने रहेंगे। यह तालिका को 'बड़े से बाहर' करने के लिए अनुमति देने के लिए अच्छा है, लेकिन जहां तक ​​मुझे पता है मौजूदा डेटा नहीं बदलेगा।

संबंधित मुद्दे