क्या खाली कॉलम एक टेबल में जगह लेते हैं?


20

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

मैं मानूंगा कि इस कॉलम के लिए एक अलग तालिका बनाना बेहतर होगा।

नोट: यह sql सर्वर 2008 है

यहां छवि विवरण दर्ज करें


आपकी प्रतिक्रिया के लिए सभी को धन्यवाद! मैंने इसे सरल रखने और तालिका में कॉलम रखने का फैसला किया और इसे किसी अन्य तालिका में नहीं रखा। हालाँकि मैंने SQL 2008 में SPARSE सुविधा का उपयोग किया है इसलिए फ़ील्ड किसी भी स्थान का उपयोग नहीं करता है।

2
बस जिज्ञासु, "अधिकांश समय" क्या है? कुल कितनी पंक्तियाँ हैं, और यहाँ कितने प्रतिशत का मूल्य है? बस सोच अगर आपका नियोजन का उपयोग कर किसी भी स्थान / प्रदर्शन की तुलना करने के लिए SPARSEऔर का उपयोग नहीं कर SPARSE...
हारून बर्ट्रेंड

जवाबों:


9

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


12

उपयोग नहीं होने पर यह न्यूनतम स्थान लेता है

  • NULL बिटमैप में एक बिट
  • लंबाई के लिए दो बाइट्स (जो शून्य होने पर शून्य होगी)

ओवरहेड न्यूनतम है और अनुकूलन समय से पहले होगा।

जब तक आप जानते हैं कि आपके पास एक मुद्दा है, बस इसे एक तालिका में रखें। आप बाहरी शुरू करने से जुड़ जाती है KISS तोड़ने के लिए और डेटा क्वेरी करने में एक ओवरहेड जोड़ें।

अधिक के लिए /programming/3793022/how-to-come-to-limits-of-8060-bytes-per-row-and-8000-per-varchar-nvarchar-valu/37373265#3793265 देखें।


10

मुझे लगता है कि पृष्ठ घनत्व में सुधार और विखंडन को कम करने के लिए एक अलग तालिका बेहतर होगी, खासकर यदि आप हमेशा उस क्षेत्र को आबाद नहीं करते हैं।

  • एक डेटा पेज लगभग 8000 बाइट्स रखता है
  • आपके पास 100 बाइट्स के साथ कुछ पंक्तियाँ हैं और 4000 बाइट्स के साथ कुछ पंक्तियाँ हैं
  • वे लंबी पंक्तियाँ स्वयं द्वारा एक पृष्ठ पर होंगी, और शेष पृष्ठ "बर्बाद" स्थान है जो आपका DB लेता है लेकिन कभी भी डेटा को धारण नहीं करेगा।
  • यदि आप किसी पूर्ण-पृष्ठ पर रिकॉर्ड के लिए उस लंबे फ़ील्ड में डेटा जोड़ते हैं, तो यह संभवतः पृष्ठ को ओवररन कर देगा और परिणाम को रिकॉर्ड के शेष पेज के साथ एक पॉइंटर में डाल देगा

ये सभी खाली पृष्ठ और संकेत खराब प्रदर्शन का कारण बनते हैं। यदि आप कर सकते हैं तो उस क्षेत्र को सामान्य करें।


4

यह प्रश्न बहुत समान दिखता है: क्या अतिरिक्त खाली कॉलम sql टेबल के आकार को काफी प्रभावित करते हैं?

ऐसा लगता है कि इसका उत्तर हां में है, यह जगह लेता है, लेकिन बहुत सारे शून्य मान वाले स्तंभों के लिए एक संपीड़न एल्गोरिदम है।

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


2
स्पष्ट होने के लिए, संपीड़न एल्गोरिथ्म केवल उन स्तंभों पर स्पष्ट रूप से परिभाषित होता है SPARSE, न कि केवल "बहुत सारे शून्य मान वाले स्तंभ।"
हारून बर्ट्रेंड

2

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

जहाँ तक इसे दूसरी तालिका में रखने की बात है, तो मैं परेशान नहीं होता। तुम भी varchar (अधिकतम) और पंक्ति विकल्पों में / बाहर का उपयोग करके देख सकते थे। फिर, शायद समय से पहले।


1
समय से पहले अनुकूलन अक्सर एक वास्तविक मुद्दा हो सकता है, लेकिन यह बाद में फिर से भरने की लागत पर निर्भर करता है। यदि आप आज जानते हैं कि आपके कॉलम में केवल 1% पंक्तियों में ही डेटा होगा, और आप समय के साथ तालिका के बड़े होने की उम्मीद करते हैं, तो उस डेटा को वर्तमान तालिका में केवल मान के रूप में परिणाम भुगतने में क्या मूल्य है? मैं समय से पहले अनुकूलन से बचने के लिए सभी हूँ, लेकिन एक बिंदु है जब मैं ऐसा करने के दीर्घकालिक प्रभाव का वजन करता हूं।
हारून बर्ट्रेंड

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