varchar (अधिकतम) हर जगह?


81

क्या आपके सभी Sql Server 2008 स्ट्रिंग कॉलम varchar (अधिकतम) बनाने में कोई समस्या है? मेरे स्वीकार्य स्ट्रिंग आकार को एप्लिकेशन द्वारा प्रबंधित किया जाता है। डेटाबेस को वही रहना चाहिए जो मैं देता हूं। क्या मैं Sql Server 2008 में सभी स्ट्रिंग कॉलम को प्रकार varchar (अधिकतम) के रूप में घोषित करके हिट करूंगा, इससे कोई फर्क नहीं पड़ता कि वास्तव में उन डेटा का आकार क्या है?


1
मेरे पढ़ने में ऐसा लगता है जैसे कि Sql Server varchar कॉलम 'ऑटोसाइज़' खुद है। तो एक varchar (अधिकतम) कॉलम नहीं होगा जहां किसी भी दिए गए मान की अधिकतम लंबाई 20 एक varchar (20) कॉलम के समान हो?
बोउर्सकिंकूपा

जवाबों:


49

का उपयोग करके VARCHAR(MAX)आप मूल रूप से SQL सर्वर को बता रहे हैं "इस क्षेत्र में मूल्यों को संग्रहीत करें कि आप सबसे अच्छा कैसे देखते हैं", SQL सर्वर तब चुनेंगे कि मूल्यों को एक नियमित VARCHARरूप से या एक एलओबी (बड़ी वस्तु) के रूप में संग्रहीत करना है या नहीं। सामान्य तौर पर यदि स्टोर किए गए मान 8,000 बाइट्स से कम हैं तो SQL सर्वर मूल्यों को एक नियमित VARCHARप्रकार के रूप में मानेगा।

यदि संग्रहीत किए गए मान बहुत बड़े हैं, तो कॉलम को LOB पृष्ठों में पृष्ठ से बाहर जाने की अनुमति है, ठीक उसी तरह जैसे वे अन्य LOB प्रकारों ( text, ntextऔर image) के लिए करते हैं - यदि ऐसा होता है, तो संग्रहीत डेटा को पढ़ने के लिए अतिरिक्त पृष्ठ रीड की आवश्यकता होती है अतिरिक्त पृष्ठों (यानी वहाँ एक प्रदर्शन penatly है), लेकिन यह केवल होता है अगर मान संग्रहीत बहुत बड़ी हैं

वास्तव में SQL सर्वर 2008 या बाद के डेटा के तहत निश्चित लंबाई डेटा प्रकारों (जैसे VARCHAR(3,000)) के साथ भी अतिरिक्त पृष्ठों पर अतिप्रवाह हो सकता है , हालांकि इन पृष्ठों को पंक्ति अतिप्रवाह डेटा पृष्ठ कहा जाता है और थोड़ा अलग तरीके से व्यवहार किया जाता है।

लघु संस्करण: भंडारण के दृष्टिकोण VARCHAR(MAX)से VARCHAR(N)कुछ के लिए उपयोग करने का कोई नुकसान नहीं है N

(ध्यान दें कि यह अन्य चर-लंबाई फ़ील्ड प्रकारों पर भी लागू होता है ) NVARCHARऔरVARBINARY

FYI करें - आप स्तंभों पर अनुक्रमित नहीं बना सकतेVARCHAR(MAX)


यह केवल अशक्त क्षेत्रों के लिए सच हो सकता है। प्रत्येक गैर-अशक्त varchar (अधिकतम) या nvarchar (अधिकतम) कॉलम को अतिरिक्त निश्चित आवंटन के 24 बाइट्स की आवश्यकता होती है। docs.microsoft.com/en-us/sql/t-sql/data-types/…
Liazy

34

इंडेक्स एक के लिए 900 बाइट्स से अधिक चौड़े नहीं हो सकते। इसलिए आप कभी भी एक इंडेक्स नहीं बना सकते हैं। यदि आपका डेटा कम है तो 900 बाइट्स, varchar (900) का उपयोग करें।

यह एक नकारात्मक पहलू है: क्योंकि यह देता है

  • वास्तव में खराब खोज प्रदर्शन
  • कोई अनोखी अड़चन नहीं

लेकिन क्या होगा यदि varchar (max) कॉलम में कोई भी मान नहीं है जो 900 बाइट से अधिक हो? यह तो सूचकांक होगा? मैं उलझन में हूं क्योंकि मैं जो कुछ पढ़ रहा हूं वह वैरिकाज़ कॉलम प्रकार ध्वनि करता है जैसे कि डेटा दर्ज किए जाने पर वे स्वयं अपने अधिकतम तक आकार लेते हैं। यह जो मैं चाहता हूं, उसके लिए एकदम सही होगा, क्योंकि यह वह एप्लिकेशन है जो अधिकतम तय करना चाहिए, डेटाबेस नहीं।
बोउर्सकिंकूपा

3
जब आप इंडेक्स बनाते हैं तो आपको एक चेतावनी मिलती है जब आपने डालने की कोशिश की थी> 900. लेकिन अगर आपका डेटा हमेशा <900 है, तो 900 का उपयोग क्यों नहीं करें? हाँ, वे चर लंबाई के तार के रूप में संग्रहीत हैं।
gbn

8
मुझे नहीं पता कि मेरा डेटा हमेशा <900 है। यह एक व्यावसायिक तर्क चिंता है। अगर वह नियम बदल जाता है तो मुझे इसे व्यावसायिक तर्क में बदलना चाहिए। मुझे डेटाबेस भी नहीं बदलना चाहिए। वैसे भी मेरा लक्ष्य यही है। यह देखने के लिए कि क्या मैं ध्यान देने योग्य प्रदर्शन हिट के बिना डेटाबेस से दूर स्ट्रिंग आकारों के बारे में चिंता करने से दूर हो सकता हूं।
बोउर्सकिंकूपा

2
एक लंबे टेक्स्ट कॉलम को इंडेक्स करना कितनी बार उपयोगी होता है? यहाँ तक कि एक varchar (200) कॉलम की तरह कुछ इंडेक्स करने के लिए भी सार्थक होगा? आखिरकार, सूचकांक ही अक्षम होगा। लंबे "सटीक मैचों" पर खोज करने की आवश्यकता कम लगती है। और पैटर्न खोज केवल तभी लाभान्वित होगी जब पैटर्न की शुरुआत ज्ञात हो।
मोहभंग

9

कुछ समय पहले साइमन सबिन ने इस पर एक पोस्ट लिखी थी। मेरे पास अब इसे हथियाने का समय नहीं है, लेकिन आपको इसे खोजना चाहिए, क्योंकि वह इस निष्कर्ष के साथ आता है कि आपको डिफ़ॉल्ट रूप से varchar (max) का उपयोग नहीं करना चाहिए।

संपादित: शमौन को varchar (max) के बारे में कुछ पोस्ट मिलीं। नीचे टिप्पणी में लिंक यह काफी अच्छी तरह से दिखा। मुझे लगता है कि सबसे महत्वपूर्ण एक है http://sqlblogcasts.com/blogs/simons/archive/2009/07/11/String-concatenation-with-max-types-stops-plan-caching , .aspx , जो प्रभाव के बारे में बात करता है योजना कैशिंग पर varchar (अधिकतम) की। सामान्य सिद्धांत सावधान रहना है। यदि आपको इसे अधिकतम करने की आवश्यकता नहीं है, तो अधिकतम उपयोग न करें - यदि आपको 8000 से अधिक वर्णों की आवश्यकता है, तो सुनिश्चित करें ... इसके लिए जाएं।




पहले वाला। OMG पोंजी द्वारा।
रोब फ़ार्ले

क्षमा करें, मेरे पास वास्तविक लिंक खोजने के लिए समय नहीं था, जब मैं जवाब से बचना चाहता था तो मैं एक बैठक में कदम रखने वाला था।
रोब फार्ले

1
और अधिक महत्वपूर्ण रूप से, यह एक: sqlblogcasts.com/blogs/simons/archive/2009/07/11/…
Rob Farley

6

इस प्रश्न के लिए विशेष रूप से कुछ बिंदु जो मैंने उल्लेख नहीं किए हैं।

  1. 2005/2008/2008 R2 पर अगर एक LOB कॉलम को एक इंडेक्स में शामिल किया जाता है, तो यह ऑनलाइन इंडेक्स को पुनर्जीवित करेगा।
  2. 2012 में ऑनलाइन इंडेक्स रीइंस्ट्रक्शन प्रतिबंध हटा दिया गया है, लेकिन LOB कॉलम नई कार्यक्षमता में भाग नहीं ले सकते हैं , ऑनलाइन ऑपरेशन के रूप में NULL कॉलम नहीं जोड़ सकते हैं
  3. इस डेटा प्रकार के कॉलम वाली पंक्तियों पर लंबे समय तक ताले को बाहर निकाला जा सकता है। ( अधिक )

कुछ अन्य कारणों से मेरे उत्तर में कवर किया गया है कि varchar(8000)हर जगह क्यों नहीं

  1. आपके प्रश्न डेटा के आकार द्वारा उचित नहीं होने वाले विशाल मेमोरी अनुदान के अनुरोध को समाप्त कर सकते हैं।
  2. ट्रिगर्स के साथ टेबल पर यह एक अनुकूलन को रोक सकता है जहां वर्जनिंग टैग नहीं जोड़े जाते हैं।

5

मैंने पहले भी ऐसा ही सवाल पूछा था। कुछ दिलचस्प जवाब मिले। इसे यहाँ देखें एक साइट थी जिसमें एक आदमी विस्तृत स्तंभों का उपयोग करने के बारे में बात कर रहा था, हालांकि यदि आपका डेटा एप्लिकेशन में सीमित है, तो मेरे परीक्षण ने इसे अस्वीकृत कर दिया। तथ्य यह है कि आप स्तंभों पर अनुक्रमणिका नहीं बना सकते हैं, इसका मतलब है कि मैं हर समय उनका उपयोग नहीं करूंगा (व्यक्तिगत रूप से मैं उनका उपयोग बिल्कुल नहीं करूंगा, लेकिन मैं उस संबंध में थोड़ा शुद्ध हूं)। हालाँकि अगर आप जानते हैं कि उनमें बहुत कुछ संग्रहीत नहीं है, तो मुझे नहीं लगता कि वे इतने बुरे हैं। यदि आप स्तंभों पर एक वर्कशीट (अधिकतम) के साथ एक रिकॉर्डसेट (या किसी भी चौड़े स्तंभ चार या चरचर) पर करते हैं, तो आप प्रदर्शन दंड भुगत सकते हैं। इन्हें अनुक्रमित करके (यदि आवश्यक हो) हल किया जा सकता है, लेकिन आप अनुक्रमित को varchar (अधिकतम) पर नहीं रख सकते। यदि आप अपने कॉलम को भविष्य में प्रूफ़ देना चाहते हैं, तो क्यों न उन्हें कुछ उचित करने के लिए कहें। उदाहरण के लिए एक नाम स्तंभ अधिकतम के बजाय 255 वर्ण होना चाहिए ...


2

सभी स्तंभों पर varchar (max) के उपयोग से बचने का एक और कारण है। उसी कारण से हम चेक बाधाओं का उपयोग करते हैं (गलत सॉफ़्टवेयर या उपयोगकर्ता प्रविष्टियों के कारण जंक के साथ तालिकाओं को भरने से बचने के लिए), हम किसी भी दोषपूर्ण प्रक्रिया के खिलाफ रक्षा करना चाहते हैं जो इच्छित से अधिक डेटा जोड़ता है। उदाहरण के लिए, यदि किसी ने या किसी चीज़ ने 3,000 बाइट्स को सिटी फ़ील्ड में जोड़ने की कोशिश की है, तो हम यह निश्चित रूप से जानेंगे कि कुछ एमिस है और वह अपने ट्रैक में मृत प्रक्रिया को जल्द से जल्द संभव बिंदु पर डिबग करना बंद करना चाहेगा। हम यह भी जानते हैं कि एक 3000-बाइट शहर का नाम संभवतः मान्य नहीं हो सकता है और रिपोर्ट को गड़बड़ कर देगा और अगर हमने इसका उपयोग करने की कोशिश की।


1

आदर्श रूप में, आपको केवल वही चाहिए जो आपको चाहिए। यदि आप कुछ विशेष स्तंभ हैं (मान लें कि एक उपयोगकर्ता नाम स्तंभ) कभी भी 20 वर्णों से अधिक लंबा नहीं होने वाला है, तो VARCHAR (20) बनाम VARCHAR (MAX) का उपयोग करके डेटाबेस को प्रश्नों और डेटा संरचनाओं का अनुकूलन करने देता है।

MSDN से: http://msdn.microsoft.com/en-us/library/ms176089.aspx

Variable-length, non-Unicode character data. n can be a value from 1 through 8,000. max indicates that the maximum storage size is 2^31-1 bytes.

क्या आप वाकई इन कॉलम के लिए 2 ^ 31-1 बाइट के करीब आने वाले हैं?


3
मुझे नहीं लगता कि इसे "आवंटित" के रूप में चिह्नित करना सटीक है। डीबी निश्चित रूप से आपको कहीं भी 2 ^ 31-1 बाइट्स आरक्षित नहीं करता है।
स्कॉट स्टैफोर्ड

1
"एक उपयोगकर्ता नाम कॉलम [..] कभी भी 20 से अधिक वर्ण लंबा नहीं होने वाला है" - ठीक है, जब तक कि एक दिन ग्राहक तय नहीं करता है कि उसे लंबे समय तक रहने की आवश्यकता है। हम सब वहा जा चुके है। :)
स्टीव स्मिथ
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.