कोई DBMS मुझे नहीं पता है कि कोई "अनुकूलन" है जो VARCHARएक 2^nलंबाई के साथ बेहतर प्रदर्शन करेगा, जो maxकि 2 की शक्ति नहीं है।
मुझे लगता है कि जल्दी SQL सर्वर संस्करणों वास्तव में एक का इलाज किया VARCHAR 255 के साथ एक अधिकतम अधिकतम लंबाई के साथ अलग-अलग तरीके से । मुझे नहीं पता कि क्या यह अभी भी मामला है।
लगभग सभी DBMS के लिए, आवश्यक वास्तविक संग्रहण केवल आपके द्वारा इसमें डाले गए वर्णों की संख्या से निर्धारित होता है, न कि maxआपके द्वारा निर्धारित लंबाई से। तो भंडारण के दृष्टिकोण से (और सबसे अधिक शायद एक प्रदर्शन के रूप में), इससे कोई फर्क नहीं पड़ता कि आप एक कॉलम को घोषित करते हैं VARCHAR(100)या नहीं VARCHAR(500)।
आपको किसी तकनीकी / भौतिक चीज़ के बजाय maxएक VARCHARकॉलम को एक प्रकार की बाधा (या व्यावसायिक नियम) के रूप में प्रदान करना चाहिए ।
PostgreSQL के लिए सबसे अच्छा सेटअप textलंबाई प्रतिबंध के बिना उपयोग करना है और CHECK CONSTRAINTजो आपके व्यवसाय के लिए आवश्यक वर्णों की संख्या को सीमित करता है।
यदि वह आवश्यकता बदल जाती है, तो तालिका को बदलने की तुलना में चेक बाधा को बदलना बहुत तेज है (क्योंकि तालिका को लिखित होने की आवश्यकता नहीं है)
वही ओरेकल और अन्य के लिए लागू किया जा सकता है - ओरेकल VARCHAR(4000)में textहालांकि इसके बजाय होगा ।
मुझे नहीं पता कि SQL सर्वर में VARCHAR(max)और इसके बीच भौतिक संग्रहण अंतर है या नहीं VARCHAR(500)। लेकिन जाहिर तौर पर varchar(max)इसकी तुलना में प्रदर्शन प्रभाव पड़ता है varchar(8000)।
इस लिंक को देखें (Erwin Brandstetter द्वारा एक टिप्पणी के रूप में पोस्ट किया गया)
2013-09-22 को संपादित करें
बिग बॉस की टिप्पणी के बारे में:
9.2 से पहले के पोस्टग्रैज संस्करण में (जो तब उपलब्ध नहीं था जब मैंने प्रारंभिक उत्तर लिखा था) स्तंभ की परिभाषा में बदलाव ने पूरी तालिका को फिर से लिखा था , उदाहरण के लिए यहां देखें । 9.2 के बाद से यह मामला नहीं है और एक त्वरित परीक्षण ने पुष्टि की है कि 1.2 मिलियन पंक्तियों वाली तालिका के लिए स्तंभ का आकार बढ़ाने में वास्तव में केवल 0.5 सेकंड का समय लगा है।
ओरेकल के लिए यह सच भी प्रतीत होता है, एक बड़ी तालिका के varcharकॉलम को बदलने में लगने वाले समय को देखते हुए । लेकिन मुझे उसके लिए कोई संदर्भ नहीं मिला।
MySQL के लिए मैनुअल कहता है " ज्यादातर मामलों में, ALTER TABLEमूल तालिका की एक अस्थायी प्रतिलिपि बनाता है "। और मेरे स्वयं के परीक्षण इस बात की पुष्टि करते हैं कि: ALTER TABLEएक स्तंभ पर आकार में वृद्धि करने के लिए 1.2 मिलियन पंक्तियों के साथ (उसी तरह पोस्टग्रेज के साथ मेरे परीक्षण में) 1.5 मिनट लगे। MySQL में हालांकि आप एक कॉलम में वर्णों की संख्या को सीमित करने के लिए एक चेक बाधा का उपयोग करने के लिए "वर्कअराउंड" का उपयोग नहीं कर सकते हैं ।
SQL सर्वर के लिए मुझे इस पर एक स्पष्ट विवरण नहीं मिल सका है, लेकिन एक varcharकॉलम के आकार को बढ़ाने के लिए निष्पादन समय (फिर से ऊपर से 1.2 मिलियन पंक्तियों की तालिका) इंगित करता है कि कोई पुनर्लेखन नहीं होता है।
2017-01-24 को संपादित करें
लगता है कि मैं (कम से कम आंशिक रूप से) SQL सर्वर के बारे में गलत था। हारून बर्ट्रेंड के इस उत्तर को देखें जो दर्शाता है कि एक nvarcharया varcharकॉलम की घोषित लंबाई प्रदर्शन के लिए बहुत बड़ा अंतर रखती है।