2011-09-22 5 views
78

मैं SQL Server 2008 का उपयोग कर रहा हूं और मुझे लगभग 500k पंक्तियों वाली तालिका में (200 से 1200) तक एक VARCHAR फ़ील्ड बड़ा करने की आवश्यकता है। मुझे यह जानने की ज़रूरत है कि क्या कोई समस्या है जिसे मैंने नहीं माना है।जब बड़ी तालिका में वचरर कॉलम के आकार में वृद्धि हुई तो क्या कोई समस्या हो सकती है?

मैं इस TSQL बयान का उपयोग किया जाएगा:

ALTER TABLE MyTable 
ALTER COLUMN [MyColumn] VARCHAR(1200) 

मैं पहले से ही डेटा की एक प्रतिलिपि पर यह कोशिश की है और इस बयान कोई बीमार प्रभाव पड़ा है कि मैं देख सकता था।

तो क्या ऐसा करने से कोई संभावित समस्याएं हैं जिन्हें मैंने नहीं माना होगा?

वैसे, कॉलम अनुक्रमित नहीं है।

+1

@nonnb: यह एक भयानक विचार है। http://stackoverflow.com/q/2091284/27535 – gbn

+0

@gbn जस्टिन के उस प्रश्न के हालिया उत्तर पर कोई विचार? कुछ हद तक आपके साथ बाधाओं में लगता है। – AakashM

+0

@AakashM: वह भंडारण के बारे में सही है लेकिन यह एक ओवरहेड है, अनुकूलन नहीं। अब यह http://stackoverflow.com/q/2009694/27535 – gbn

उत्तर

54

यह केवल मेटाडाटा परिवर्तन है: यह तेज़ है।

एक अवलोकन: निर्दिष्ट शून्य या नहीं स्पष्ट रूप से शून्य "दुर्घटनाओं" अगर सेट ANSI_xx सेटिंग्स में से एक osql में विभिन्न जैसे रन हैं से बचने के लिए नहीं SSMS किसी कारण

+1

सब इसके साथ ठीक हो गया। कोई समस्या नहीं। –

+0

क्या आप जानते हैं कि वही नियम 'वर्कर (200)' से 'वर्कर (अधिकतम)' पर जाने पर लागू होते हैं? – CodeNaked

+0

@CodeNaked: यह उत्तर देने के लिए बहुत मुश्किल है। (अधिकतम) एक LOB प्रकार है जो "पंक्ति में" या पंक्ति के बाहर हो सकता है।हालांकि, मैं यह कहने के इच्छुक हूं कि यह वही होना चाहिए क्योंकि डेटा पहले से ही "पंक्ति में" है और कोई तालिका पुनर्निर्माण की आवश्यकता नहीं होगी – gbn

4

VARCHAR (1200) Varchar से करने के लिए बदल रहा है के लिए (200) आपको कोई मुद्दा नहीं होना चाहिए क्योंकि यह केवल मेटाडेटा परिवर्तन है और चूंकि SQL सर्वर 2008 अत्यधिक रिक्त स्थान को छोटा करता है, आपको कोई प्रदर्शन अंतर नहीं दिखाना चाहिए, इसलिए संक्षेप में परिवर्तन करने में कोई समस्या नहीं होनी चाहिए।

+0

मुझे विश्वास है कि यह छोटी तालिकाओं के लिए सच हो सकता है, लेकिन बड़े टेबल के लिए जो सक्रिय रूप से पूछे जा रहे हैं महत्वपूर्ण समय के लिए अवरुद्ध हो सकता है (क्योंकि SQL सर्वर को यह देखने की आवश्यकता है कि उसे प्रत्येक पंक्ति को छोटा करने की आवश्यकता है या नहीं)। – CodeNaked

-3

मेरे मामले में बदल स्तंभ काम कर रहा था तो एक 'संशोधित करें' आदेश का उपयोग कर सकते हैं, जैसे:

बदलने तालिका [TABLE_NAME] संशोधित स्तंभ [स्तंभ] varchar (1200);

+4

ऐसा इसलिए है क्योंकि आप प्रश्न प्रति SQL सर्वर का उपयोग नहीं कर रहे हैं (लेकिन MySQL, शायद)। "वैकल्पिक तालिका ... संशोधित" मान्य टी-एसक्यूएल नहीं है। –

5

बस, मेरे 2 सेंट जोड़ना चाहते थे क्योंकि मैं इस सवाल googled b/c मैं खुद को एक ऐसी ही स्थिति में पाया ...

बारे में पता होना कि जब varchar(xxx) से varchar(yyy) के लिए बदल रहा एक मेटा डेटा है वास्तव में बदलें, लेकिन varchar(max) में बदलना नहीं है। क्योंकि varchar(max) मान (उर्फ BLOB मान - छवि/टेक्स्ट इत्यादि) डिस्क पर अलग-अलग संग्रहित होते हैं, तालिका पंक्ति में नहीं, बल्कि "पंक्ति से बाहर"। तो सर्वर एक बड़ी मेज पर पागल हो जाएगा और मिनटों (घंटे) के लिए उत्तरदायी बन जाएगा।

--no downtime 
ALTER TABLE MyTable ALTER COLUMN [MyColumn] VARCHAR(1200) 

--huge downtime 
ALTER TABLE MyTable ALTER COLUMN [MyColumn] VARCHAR(max) 

पीएस। यह nvarchar या पाठ्यक्रम पर लागू होता है।

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