जब बड़ी मेज पर VARCHAR कॉलम का आकार बढ़ जाता है तो क्या कोई समस्या हो सकती है?


87

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

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

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

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

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

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


1
@ गनब: यह एक भयानक विचार है। stackoverflow.com/q/2091284/27535
gbn

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

@ आकाश: वह स्टोरेज के बारे में सही है लेकिन यह ओवरहेड है, ऑप्टिमाइज़ेशन नहीं। अब इस stackoverflow.com/q/2009694/27535
gbn

@gb - अच्छा बिंदु, जैसा कि मार्टिन स्मिथ ने अनुक्रमण पर अवलोकन किया है। वापस ले लिया।
स्टुअर्टएलसी

2
अंत में एक गच्चा निकला! फ़ील्ड को अनुक्रमित किया गया था, और जब किसी ने 900 बी से बड़ी प्रविष्टि दर्ज करने की कोशिश की तो वह विफल हो गया! चेतावनी दी।
पॉल टी डेविस

जवाबों:


59

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

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


1
इससे सब ठीक हो गया। कोई समस्या नहीं।
पॉल टी डेविस

क्या आप जानते हैं कि जब वही नियम लागू होते हैं तो क्या होता varchar(200)है varchar(max)?
कोडनक्ड

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

12

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

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

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

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

पुनश्च। यही बात nvarcharपाठ्यक्रम पर लागू होती है ।


4

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


मेरा मानना ​​है कि यह छोटी टेबल्स के लिए सही हो सकता है, लेकिन बड़ी टेबल्स के लिए जो सक्रिय रूप से क्वियर की जा रही हैं, यह एक महत्वपूर्ण समय के लिए ब्लॉक हो सकती है (क्योंकि SQL सर्वर को यह देखने की जरूरत है कि क्या इसे हर पंक्ति को छोटा करना है)।
कोडनॉक्ड

0

एक और कारण है कि आपको कॉलम को varchar (अधिकतम) में परिवर्तित करने से बचना चाहिए क्योंकि आप एक varchar (अधिकतम) कॉलम पर एक इंडेक्स नहीं बना सकते हैं।


-3

मेरे मामले में परिवर्तन कॉलम काम नहीं कर रहा था, इसलिए कोई 'संशोधित' कमांड का उपयोग कर सकता है, जैसे:

परिवर्तन तालिका [table_name] MODIFY कॉलम [column_name] varchar (1200);


5
ऐसा इसलिए है क्योंकि आप प्रति प्रश्न (लेकिन MySQL, शायद) SQL सर्वर का उपयोग नहीं कर रहे हैं। "TABLE TABLE ... MODIFY" मान्य T-SQL नहीं है।
जीरोन मोस्टर्ट
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.