SQL सर्वर में varchar नौकरशाही के विषय में वर्तमान सर्वोत्तम अभ्यास क्या हैं?


12

मैं यह तय करने का सबसे अच्छा तरीका समझने की कोशिश कर रहा हूं कि स्टोरेज और परफॉर्मेंस दोनों के नजरिए से कितना बड़ा वर्चर कॉलम होना चाहिए।


मेरे शोध से प्रदर्शन , ऐसा लगता हैयदि आपको वास्तव में इसकी आवश्यकता है तो केवल उस varchar (अधिकतम) का उपयोग किया जाना चाहिए; यदि स्तंभ 8000 से अधिक वर्णों को समायोजित करता है, तो एक कारण अनुक्रमण की कमी है (हालांकि मैं सामान्य रूप से varchar फ़ील्ड्स पर अनुक्रमण का थोड़ा संदेह करता हूं। मैं हालांकि DB सिद्धांतों के लिए बहुत नया हूं, इसलिए शायद यह निराधार है। ) और संपीड़न (अधिक भंडारण चिंता)। वास्तव में, सामान्य तौर पर लोग आपको केवल वही उपयोग करने की सलाह देते हैं जो आपको चाहिए, जब varchar (n) कर रहे हों .... ओवरसाइज़िंग खराब है, क्योंकि अधिकतम संभव आकार के लिए प्रश्नों का हिसाब होना चाहिए। लेकिन यह भी कहा गया है कि इंजन डेटा के औसत वास्तविक आकार के अनुमान के रूप में संकेतित आकार का आधा उपयोग करेगा। इसका अर्थ यह होगा कि किसी व्यक्ति को डेटा से यह निर्धारित करना चाहिए कि औसत आकार क्या है, इसे दोगुना करें और इसे n के रूप में उपयोग करें। हालांकि बहुत कम लेकिन गैर-शून्य परिवर्तनशीलता वाले डेटा के लिए, इसका अर्थ अधिकतम आकार पर ओवरसाइड करते हुए 2x तक है, जो बहुत कुछ लगता है, लेकिन शायद ऐसा नहीं है? अंतर्दृष्टि की सराहना की जाएगी।

संग्रहण के
बारे में पढ़ने के बाद कैसे-पंक्ति बनाम आउट-ऑफ-पंक्ति संग्रहण कार्य करता है, और यह ध्यान में रखते हुए कि वास्तविक संग्रहण वास्तविक डेटा तक सीमित है, यह वास्तव में मुझे लगता है कि n की पसंद भंडारण पर बहुत कम या कोई असर नहीं है (इसके अलावा यह सुनिश्चित करना कि यह सब कुछ धारण करने के लिए पर्याप्त बड़ा है)। यहां तक ​​कि varchar (max) के उपयोग से भंडारण पर कोई प्रभाव नहीं पड़ना चाहिए। इसके बजाय, यदि संभव हो तो एक लक्ष्य प्रत्येक डेटा पंक्ति के वास्तविक आकार को ~ 8000 बाइट्स तक सीमित करना हो सकता है। क्या यह चीजों पर सटीक पढ़ा गया है?

संदर्भ
हमारे कुछ ग्राहक डेटा में थोड़ा उतार-चढ़ाव होता है, इसलिए हम आम तौर पर उन कॉलमों के लिए 15-20% बड़े कहे जाने की तुलना में कॉलम को थोड़ा व्यापक बनाते हैं। मैं सोच रहा था कि क्या कोई अन्य विशेष विचार थे; उदाहरण के लिए, मेरे साथ काम करने वाले किसी व्यक्ति ने मुझे 2 ^ n - 1 आकार का उपयोग करने के लिए कहा (मुझे कोई सबूत नहीं मिला कि यह एक बात है हालांकि ....)

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

सवाल यह है कि तकनीकी दिशा-निर्देश कितने हैं, और क्या हैं?


MongoDB एक दस्तावेज़ के लिए 2 ^ n डिस्क आवंटन का उपयोग करता है। SQL सर्वर इस रणनीति का उपयोग नहीं करता है।
माइकल ग्रीन

जवाबों:


19

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

आपको अधिकतम वास्तविक आकार की तुलना में स्तंभ की लंबाई निर्दिष्ट करने की आवश्यकता नहीं है, न ही चाहते हैं, जो विभिन्न कारणों से संग्रहीत की जाएगी: क्वेरी मेमोरी आवंटन, संभवतः अधिकतम पंक्ति आकार भरना और स्तंभ जोड़ने के लिए कोई जगह नहीं छोड़ना। भविष्य, आदि

सही, परिवर्तनशील लंबाई स्ट्रिंग और बाइनरी कॉलम में स्टोरेज निहितार्थ नहीं होता है जो निश्चित-लंबाई डेटाटिप्स (स्ट्रिंग / बाइनरी / न्यूमेरिक / दिनांक / आदि) करते हैं (हालांकि, उन निहितार्थों में से कुछ डेटा संपीड़न या SPARSEस्तंभ परिभाषा के उपयोग के माध्यम से शून्य हो सकते हैं। विकल्प)। हालाँकि, जैसा कि आपने बताया, भले ही कोई प्रत्यक्ष भंडारण निहितार्थ नहीं है, फिर भी प्रश्नों के लिए आवश्यक स्मृति को कम करने का प्रदर्शन निहितार्थ है।

समझदार बनना। केवल इच्छित चीज़ उपयोग करें। विचार किया जा सकता है यदि उच्च संभावना है कि निकट भविष्य में स्तंभ की लंबाई बढ़ाने की आवश्यकता होगी, लेकिन ध्यान रखें कि स्तंभ के आकार को कम करने की तुलना में विस्तार करना आसान है। हां, कुछ काम शामिल होंगे, लेकिन चूंकि यह काम केवल "संभावित" है, जबकि ओवर-साइज़िंग के प्रदर्शन के निहितार्थ "वास्तविक" हैं, अक्सर यह स्तंभों को परिभाषित करने के लिए सबसे अच्छा है कि आपको वास्तव में क्या चाहिए, न कि आप-थोड़े -सोर्टा को लगता है कि आपको भविष्य में इसकी आवश्यकता हो सकती है। कई बदलावों के बारे में बात की जाती है जो कभी नहीं होते हैं, और अक्सर जिन परिवर्तनों की आवश्यकता होती है, वे दूर नहीं हो सकते हैं। तुम जो जानते हो, उसके साथ जाओ।

इसके बजाय, यदि संभव हो तो एक लक्ष्य प्रत्येक डेटा पंक्ति के वास्तविक आकार को ~ 8000 बाइट्स तक सीमित करना हो सकता है।

मैं बिल्कुल निश्चित नहीं हूं कि आप यहां क्या कर रहे हैं। SQL सर्वर शारीरिक रूप से आपको केवल 8000 बाइट्स तक सीमित करेगा। LOB प्रकार का उपयोग करना - VARCHAR(MAX), NVARCHAR(MAX), VARBINARY(MAX), XML, और पदावनत TEXT, NTEXTऔर IMAGEप्रकार - कि प्रारंभिक पृष्ठ आकार सीमा से परे जाने के लिए अनुमति देते हैं, लेकिन यह केवल एक सूचक (16 या अधिक बाइट्स, प्रकार के आधार पर रखने, और पर निर्भर करता है की वजह से है MAXप्रकारों का उपयोग करते समय ऑफ-रो स्टोर किए जाने वाले मूल्य का आकार )। डेटा पृष्ठ की वास्तविक भौतिक सीमा नहीं बदली।

आपका लक्ष्य यह निर्धारित करने के लिए होना चाहिए कि भौतिक स्थान की कम से कम मात्रा का उपयोग करें कि ऐप / व्यवसाय को बिना तोड़े या काट-छाँट किए बिना स्टोर करने की क्या ज़रूरत है, क्योंकि अधूरा मूल्य अर्थ खो देता है या समस्याओं का कारण बनता है। यदि आपको 12,000 वर्ण वाली VARCHAR(MAX)चीज़ों को संग्रहीत करने की आवश्यकता है, तो इसका उपयोग करें, क्योंकि इसकी आवश्यकता है। यदि आप एक फ़ोन नंबर या पोस्टल / ज़िप कोड स्टोर कर रहे हैं, तो यह उपयोग करने के लिए नासमझी VARCHAR(100), और उपयोग करने के लिए गैर जिम्मेदार होगा VARCHAR(MAX)

हमारे ग्राहकों के कुछ डेटा में थोड़ा उतार-चढ़ाव होता है, इसलिए हम आम तौर पर उन कॉलमों के लिए 15-20% बड़े कहे जाने की तुलना में कॉलम को थोड़ा व्यापक बनाते हैं। मैं सोच रहा था कि क्या कोई अन्य विशेष विचार थे;

सभी प्रणालियों में कम से कम कुछ डेटा नहीं होता है जो उतार-चढ़ाव करता है? कोई भी प्रणाली जो किसी व्यक्ति के नाम को संग्रहीत करती है वह योग्य होगी, है ना? नामों की लंबाई में काफी बड़ा परिवर्तन है। और फिर आपके पास कोई है जैसे राजकुमार जाओ और अपना नाम बदलकर एक प्रतीक बनाओ और अब आपके पास एक पूरी तरह से अलग समस्या है जो लंबाई नहीं है। यह सिर्फ बातें हैं।

लेकिन, एक पल के लिए शैतान के वकील की भूमिका निभाने के लिए: "15-20% से बड़ा क्या आवश्यक है" मूल्य वास्तविक आवश्यक मूल्य नहीं हो सकता है ? मान लीजिए कि एक नया कॉलम जोड़ने के बारे में चर्चा है, और कोई 50 वर्णों का सुझाव देता है, तो कोई और कहता है, "अच्छा, 20% अधिक 60 है तो चलो 60 करते हैं क्योंकि किसी के पास 60 हो सकते हैं।" यदि यह सच है कि एक ग्राहक के पास 60 हो सकता है, तो 60 है, और हमेशा था, वास्तविक आवश्यक मूल्य, और 50 पूरे समय गलत था।

बेशक, यह मदद करेगा अगर डेटा के स्रोत के रूप में कुछ संकेत था:

  1. यदि आप "URL" 1024 बनाते हैं और किसी को 1060 की आवश्यकता होती है, तो उसे 1060 होना चाहिए (इसी तरह, यदि आप URL बनाते हैं VARCHARऔर शिकायतें मिलती हैं कि यह यूनिकोड वर्णों को गड़बड़ कर रहा है, जो अब डोमेन नाम में अनुमत हैं, तो यह आवश्यक है NVARCHAR), परंतु
  2. अगर कोई 1000 वर्ण-सीमा टिप्पणी क्षेत्र में 1000 वर्ण जोड़ना चाहता है, तो उसे अभी भी केवल 500 होने की आवश्यकता है। लोग टिप्पणियों में कम क्रिया कर सकते हैं (मेरे लिए एक बड़ी चुनौती ;-), लेकिन ProductSKUसभी को फिट करने के लिए बेहतर होना चाहिए। ग्राहक के SKUs की।

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

आप यहाँ बहुत सारी धारणाएँ बना रहे हैं। ज़रूर कुछ खेत बड़े हो सकते हैं। लेकिन फिर, वे नहीं हो सकता है। या, कुछ छोटा हो सकता है। कुछ गैर-यूनिकोड होने से बदलकर यूनिकोड हो सकते हैं (एक बार जब उन्हें पता चलता है कि दुनिया छोटी हो रही है और कोई यह नहीं मान सकता है कि अंतिम नामों में केवल मूल ASCII / US अंग्रेजी अक्षर होंगे)। या, वे एक फ़ील्ड भेजना बंद कर सकते हैं। या वे भविष्य में एक या अधिक फ़ील्ड जोड़ सकते हैं। इस और अन्य चीजों का कोई संयोजन। तो केवल VARCHARकॉलम पर ध्यान क्यों दें ? क्या होगा अगर वे वर्तमान में एक INTमूल्य भेज रहे हैं और एक या दो साल में वे अधिकतम मूल्य तक पहुंचते हैं और एक भेजना शुरू कर रहे हैं BIGINT? क्या होगा यदि उनके पास मान 0 के साथ "स्थिति" फ़ील्ड है - 5. क्या आप बस मानने जा रहे हैंINTजो "गद्देदार" है क्योंकि यह विकास की अनुमति देता है, लेकिन संभवतः होना चाहिए TINYINT?

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

तो दिशानिर्देश है:

  1. एक अचूक प्रश्न का उत्तर देने की कोशिश में समय और ऊर्जा बर्बाद न करें।
  2. इसके बजाय, अपने ग्राहक के वास्तविक डेटा के बारे में अधिक से अधिक जानकारी प्राप्त करने पर ध्यान केंद्रित करें, और उस (यानी डेटा-चालित निर्णय) ;-) पर जाएं।

आपके पास पहले से ही उदाहरण डेटा है, बढ़िया। लेकिन, कृपया यह न भूलें कि आपके पास अपने ग्राहक की संपर्क जानकारी भी है: फोन और / या ईमेल। उनसे मिलो! उनसे उनके डेटा स्पेक्स के लिए पूछें (आपकी प्रणाली की तरह, वर्तमान में उनके सिस्टम में डेटा की अधिकतम लंबाई 35 हो सकती है, लेकिन उनकी प्रणाली को इस रूप में परिभाषित किया गया है VARCHAR(50), और उनका सिस्टम उस लंबाई तक स्वीकार करेगा, जिस स्थिति में आपको उपयोग करना चाहिए 50)। और, उनसे पूछें कि क्या उनके पास उन डेटाटाइप्स (प्रकार और / या आकार) को बदलने की कोई निकट-अवधि की योजना है।


1
मैं सुलैमान से सहमत हैं, @ Aristotle2600 - हालांकि, आप पर एक नज़र लेने के लिए चाहते हो सकता है मेरा उत्तर एक के बीच मतभेद के बारे में एक सवाल पर varchar(255)और एक varchar(256)कुछ आगे विचार के लिए
मैक्स वेरनॉन

धन्यवाद, मैं इस धारणा के तहत था कि यह कुछ इस तरह का होगा, और "केवल उसी चीज का उपयोग करें जिसकी आपको आवश्यकता है" बस अच्छे संसाधन प्रबंधन का अभ्यास है। लेकिन, हमारे कुछ ग्राहक डेटा में थोड़ा उतार-चढ़ाव आता है, इसलिए हम आम तौर पर उन कॉलमों के लिए 15-20% बड़े होने की तुलना में स्तंभों को थोड़ा व्यापक बनाते हैं। मैं सोच रहा था कि क्या कोई अन्य विशेष विचार थे; उदाहरण के लिए, मेरे साथ काम करने वाले किसी व्यक्ति ने मुझे 2 ^ n - 1 आकार का उपयोग करने के लिए कहा था (मुझे कोई सबूत नहीं मिला है कि हालांकि यह एक बात है ....)। लेकिन ऐसा लगता है कि चीजों को जितना संभव हो उतना छोटा रखने के अलावा कुछ और नहीं है।
aristotle2600

1
यह और भी सैद्धांतिक रूप से कुछ बड़ा की तुलना में यह करना संभव है:, लेकिन मैं अभी भी पूछना होगा - @ aristotle2600 यकीन है कि कैसे "1 2 ^ n" लागू करने के लिए नहीं की जरूरत होने के लिए? ऐसा नहीं है कि 15-20% बड़े आकार चाहेंगे हो आकार है कि यह जरूरत नहीं तोड़ करने के लिए? ;-)। मुझे यकीन है कि यदि आप डेटा के स्रोत में अधिक स्पष्ट थे, तो यह मदद करेगा क्योंकि a) यदि आप "URL" 1024 बनाते हैं और किसी को 1060 चाहिए, तो उसे 1060 होना चाहिए, लेकिन b) यदि कोई 1000 जोड़ना चाहता है एक 500 चार-सीमा टिप्पणी क्षेत्र के लिए चार्ट, तो यह अभी भी केवल 500 होने की जरूरत है। लोग टिप्पणियों में कम दर्ज कर सकते हैं, लेकिन उत्पाद SKU बेहतर पर्याप्त बड़ा हो सकता है।
सोलोमन रटज़की

@ aristotle2600 मैंने आपके कुछ प्रश्नों को यहाँ प्रश्न में जोड़ा क्योंकि वे अच्छा संदर्भ प्रदान करते हैं। मैंने अपने उत्तर के अंत में सामान भी जोड़ा :)
सोलोमन रटज़की ने

आपके उत्तर के लिए बहुत बहुत धन्यवाद! हाँ, नाम और पते फ़्लिक करते हैं। जहां तक ​​लगातार 20% विरोधाभास है, मैं देख रहा हूं कि आपका क्या मतलब है, लेकिन मैं प्रारंभिक तालिका निर्माण के बारे में बात कर रहा हूं। एक ग्राहक हमें बताएगा कि वे हमें एक नई तालिका भेजना शुरू करने जा रहे हैं, और नमूना डेटा (या सिर्फ पहला उत्पादन डेटासेट) भेज रहे हैं, जिसे हम देखते हैं और डेटा को पकड़ने के लिए हमारे अंत में एक तालिका बनाते हैं। हम भविष्य के आयात को संभालने के लिए अपने अंत में तालिका बनाना चाहते हैं और साथ ही नमूने में क्या है। लेकिन, कुछ पंक्तियाँ अधिक लंबी होती हैं, इसलिए हम उन्हें पैड करते हैं। सवाल यह है कि तकनीकी दिशा-निर्देश कितने हैं, और क्या हैं?
aristotle2600
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.