डेटाबेस डिज़ाइन में ओवरस्टेट क्षेत्र का आकार


11

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

आपके सुझाव के लिए धन्यवाद।


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

आपको एक पृष्ठ (8k) के आकार के ऊपर जाने का ध्यान रखना चाहिए क्योंकि यह प्रदर्शन को प्रभावित करेगा। इस पोस्ट को देखें: stackoverflow.com/questions/2518922/…

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

3
मुझे लगता है कि भंडारण की अनदेखी करना सस्ता है क्योंकि यह एक बुरा विचार है। डिस्क पर प्रत्येक बाइट को लाने और संसाधित करने की आवश्यकता होती है, और लगभग हर SQL सर्वर इंस्टॉलेशन का सबसे धीमा हिस्सा डिस्क स्टोरेज होता है। कम बाइट्स = तेज प्रश्न।
JNK

1
यदि 100MB के कारण 512MB डिस्क कंट्रोलर कैश में 20% कम डेटा फिट होता है, तो यह पूरी तरह से (अनुभव की आवाज) होगा।
एरिक जे।

जवाबों:


16

यदि आप के बारे में बात कर रहे हैं varcharऔर nvarcharफिर नहीं, तो उच्च क्षेत्र की लंबाई की अनुमति देने के लिए कोई जुर्माना नहीं है।


कुछ को ध्यान में रखते हुए, हालांकि:

  • चर लंबाई फ़ील्ड (प्रति फ़ील्ड) के लिए प्रति पंक्ति 2 बाइट ओवरहेड है । यदि आपके पास बहुत छोटा क्षेत्र है तो इसका उपयोग करने के लिए अधिक समझदारी हो सकती है CHARVarchar(2)उदाहरण के लिए, प्रति पंक्ति 2-4 बाइट्स के बीच वास्तव में उपयोग करता है, जबकि CHAR(2)हमेशा 2 का उपयोग करता है।
  • बहुत लंबे क्षेत्रों को अनुक्रमित नहीं किया जा सकता है। एक सूचकांक कुंजी सेट में सभी क्षेत्रों के लिए अधिकतम लंबाई 900 बाइट्स है।
  • यदि आप अपनी अपेक्षा से अधिक डेटा की अनुमति देते हैं, तो आपको अंततः अप्रत्याशित परिणाम प्राप्त होंगे। यदि आप किसी सड़क के नाम के लिए 100 वर्णों की अनुमति देते हैं, तो कुछ बिंदु पर अन्य डेटा को उस क्षेत्र में जाने की संभावना है, जिसके बारे में आपको जानकारी नहीं है (उदाहरण के लिए पूरा पता)। यदि आपके पास यह उचित आकार का होता है, तो आपको इसके बजाय डालने पर त्रुटि मिलेगी।
  • बहुत विस्तृत पंक्तियों के कारण पृष्ठ विभाजन और विखंडन हो सकता है। यदि आपके पास 8k से अधिक लंबी पंक्ति है, तो उसे कई डेटा पृष्ठों पर विभाजित करना होगा। इनमें से बहुत से वास्तव में प्रदर्शन को नुकसान पहुंचा सकता है। सामान्य रूप से संकीर्ण अधिक कुशल है।

1
आप इस उत्तर को छोटा करने के लिए कैविटीज़ भी जोड़ सकते हैं, उदाहरण के लिए सुनिश्चित करें कि कॉलम कम से कम पर्याप्त रूप से बड़ा हो: पता varchar (30) Bolderwood Arboretum Ornamental Drive या Northeast Kentucky Industrial Parkway के साथ सामना नहीं कर सकता ।

@ अलेक्सी - बहुत सच। मुझे लगता है कि वे अधिक स्पष्ट हैं, हालांकि, यही वजह है कि ओपी शुरू करने के लिए व्यापक क्षेत्रों का उपयोग कर रहा है।
JNK

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


2

यदि आपका मतलब है, "क्या वास्तव में इसमें संग्रहीत किसी भी मूल्य की तुलना में क्षेत्र के आकार को बड़ा घोषित करने के लिए जुर्माना है?", तो जब तक इसे varchar घोषित किया जाता है, तब तक उत्तर नहीं होता है। हर SQL DB इंजन जिसे मैं स्टोर करता हूं, केवल वास्तव में डेटा में दिए गए वर्णों की संख्या (साथ ही एक लंबाई मान)। इसलिए यदि आप फ़ील्ड को varchar (100) के रूप में परिभाषित करते हैं, लेकिन इसमें केवल 10 वर्णों को संग्रहीत करते हैं, तो यह केवल डिस्क पर 10 वर्णों (प्लस 2 बाइट्स या लंबाई के लिए) को ले जाएगा। जब संदेह होता है, तो मैं नियमित रूप से अपने वर्चर फ़ील्ड को हास्यास्पद रूप से बड़ा बनाता हूं।

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

ध्यान रखें कि यदि आप उपयोगकर्ता को एक बड़ा डेटा प्रविष्टि क्षेत्र देते हैं, तो वे इसका उपयोग जल्द या बाद में करेंगे।

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


2

कोई भी व्यक्ति यह दावा करता है कि वास्तव में तालिका में जो संग्रहित होने जा रहा है, उससे बड़ा क्षेत्र आकार घोषित करने के लिए कोई दंड नहीं है। डेटा का वास्तविक आकार (प्लस 2 बाइट ओवरहेड) वह है जो वास्तव में संग्रहीत होता है, लेकिन यह स्तंभ की परिभाषा है जिसका उपयोग अनुमान लगाने के लिए किया जाता है जहां तक ​​निष्पादन योजना जाती है। इसलिए, 10 वर्ण मान संग्रहीत करने के लिए एक varchar (1000) की घोषणा करते समय, डिस्क स्थान के केवल 12 वर्ण खाएंगे, निष्पादन योजना का अनुमान बहुत कम कुशल और नकारात्मक तिरछा होगा, दोनों के लिए कि ऑपरेशन को कितना मेमोरी देना है और ऑपरेशन को पूरी तरह से मेमोरी में किया जा सकता है या नहीं या इसके लिए टेम्पर्ड ड्राइव स्पेस की आवश्यकता होगी या नहीं। आप अपना कॉलम वर्चर (1000) बना सकते हैं, लेकिन इंजन को पता नहीं है कि आपके सभी संग्रहीत मूल्य वास्तव में varchar (10) से कम हैं,


0

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

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.