SQL सर्वर में "Null" मान कितना आकार लेता है


118

मेरे पास 10 कॉलम के साथ एक बड़ी तालिका है। उनमें से 4 अधिकांश समय अशक्त रहते हैं। मेरे पास एक क्वेरी है जो शून्य मान को बाइट्स में कोई भी आकार या कोई आकार नहीं लेता है। मैंने कुछ लेख पढ़े उनमें से कुछ कह रहे हैं:

http://www.sql-server-citation.com/2009/12/common-mistakes-in-sql-server-part-4.html

एक गलत धारणा है कि यदि हमारे पास तालिका में NULL मान हैं तो यह भंडारण स्थान पर कब्जा नहीं करता है। तथ्य यह है कि, एक NULL मान अंतरिक्ष पर कब्जा कर लेता है - 2 बाइट्स

SQL: NULL मान बनाम डिफ़ॉल्ट मान का उपयोग करना

एक NULLडेटाबेस में मूल्य एक प्रणाली मूल्य कि भंडारण की एक बाइट लेता है और पता चलता है कि एक मूल्य के उपहार के रूप में एक अंतरिक्ष या शून्य या किसी अन्य डिफ़ॉल्ट मान के लिए विरोध नहीं है।

क्या आप अशक्त मूल्य द्वारा लिए गए आकार के बारे में मुझे मार्गदर्शन कर सकते हैं।

जवाबों:


146

यदि फ़ील्ड निश्चित चौड़ाई है, तो NULL को संग्रहीत करने का स्थान किसी अन्य मान के समान होता है - फ़ील्ड की चौड़ाई।

यदि फ़ील्ड परिवर्तनशील है, तो NULL मान कोई स्थान नहीं लेता है।

रिक्त मान को संग्रहीत करने के लिए आवश्यक स्थान के अलावा एक अशक्त स्तंभ होने के लिए एक ओवरहेड भी है। प्रत्येक पंक्ति के लिए प्रति कॉलम एक बिट का उपयोग यह बताने के लिए किया जाता है कि उस कॉलम का मान शून्य है या नहीं। यह सही है कि क्या स्तंभ निश्चित है या परिवर्तनशील लंबाई है।


अन्य स्रोतों से जानकारी में आपके द्वारा देखी गई विसंगतियों का कारण:

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

  • दूसरा लिंक Microsoft Access के बारे में एक प्रश्न लगता है। मुझे इस बात की जानकारी नहीं है कि एक्सेस NULLs को कैसे स्टोर करता है लेकिन मुझे आश्चर्य नहीं होगा अगर यह SQL सर्वर से अलग है।


1
@ मर्क "यह सच है कि स्तंभ को अशक्त बनाने के लिए भंडारण स्थान में कुछ खर्च होता है, लेकिन एक बार जब आप यह कर लेते हैं कि किसी NULL को संग्रहीत करने में कम स्थान लेता है, तो इसका मूल्य (परिवर्तनीय चौड़ाई के स्तंभों के लिए) लेता है" इसके द्वारा आपका मतलब है कहने का मतलब यह है कि चर डेटाटाइप के लिए मेमोरी में लिया गया आकार 1 बिट है।
रॉकी सिंह

13
अधिकांश कंप्यूटर सिस्टम में मेमोरी की सबसे छोटी पता योग्य इकाई एक है byte(आमतौर पर 8 बिट्स)। तो वास्तव में, एक bitलेता है byte। शानदार उत्तर मार्क: +1।
जॉनबी

20
हालांकि, एक दूसरा बिट, और एक तीसरा बिट, और एक ही बाइट में आठवें बिट तक सभी तरह से फिट होते हैं।
मत्ती विर्ककुनेन

1
@ मर्क - हां जो बहुत साफ दिखता है। गायब टिप्पणी के लिए क्षमा याचना। मेरा मतलब इसे संशोधित करना था लेकिन मेरा इंटरनेट कनेक्शन डिलीट और सबमिशन के बीच नीचे चला गया! यह थोड़ा भी निर्भर करता है (टिप्पणी अनुभाग से यहां) "ढेर और क्लस्टर किए गए इंडेक्स रिकॉर्ड के लिए, हमेशा एक NULL बिटमैप होता है। गैर-संकुल इंडेक्स के लिए, ऐसा नहीं होगा यदि इंडेक्स के सभी कॉलम NULL नहीं हैं।"
मार्टिन स्मिथ

2
@ मर्टिन स्मिथ: मुझे नहीं पता था कि। यह चीजों को और अधिक जटिल बनाता है क्योंकि अगर मैं इसे सही ढंग से समझता हूं तो इसका मतलब है कि एक कॉलम को अशक्त बनाना स्टोरेज स्पेस में वृद्धि नहीं करता है (क्योंकि नल बिटमैप हमेशा मौजूद होता है) जब तक कि कॉलम इंडेक्स में न हो और इंडेक्स में अन्य कॉलम अशक्त नहीं हैं। इस मामले में सूचकांक में अब एक शून्य बिटमैप शामिल होना चाहिए।
मार्क बायर्स

30

निम्न लिंक का दावा है कि यदि स्तंभ परिवर्तनशील लंबाई है, varcharतो NULL0 बाइट लेता है (साथ ही 1 बाइट का उपयोग यह चिह्नित करने के लिए किया जाता है कि मूल्य है NULLया नहीं):

उपरोक्त लिंक और साथ ही नीचे दिए गए लिंक का दावा है कि निश्चित लंबाई के कॉलम के लिए, यानी char(10)या int, कॉलम की लंबाई पर मान का मान NULL(साथ ही यह है NULLया नहीं) ध्वज लगाने के लिए 1 बाइट :

उदाहरण:

  1. यदि आप एक सेट करते char(10)हैं NULL, तो यह 10 बाइट्स (शून्य बाहर) रखता है
  2. एक int4 बाइट्स लेता है (शून्य शून्य भी)।
  3. 0 बाइट्स (+ 2 बाइट्स) के varchar(1 million)लिए एक सेटNULL

नोट: एक मामूली स्पर्शरेखा पर, भंडारण आकार varcharडेटा की लंबाई + 2 बाइट्स दर्ज किया गया है।


क्या कोई वैल्चर एक NULL ले 0 + 2 + 1 (NULL ओवरहेड) बाइट्स को संग्रहीत नहीं करेगा?
आकाश

NULL को फ़्लैग करने के लिए + 1 बिट होना चाहिए । @ आकाश: 2 बाइट्स आवश्यक नहीं होने चाहिए क्योंकि बिटमैप पहले से ही मूल्य को चिह्नित करता है क्योंकि NULL (कोई जानकारी नहीं जोड़ी जाएगी)।
सिमो किविस्टो

5

इस लिंक से :

प्रत्येक पंक्ति में स्तंभों के लिए एक शून्य बिटमैप है जो नल की अनुमति देता है। यदि उस स्तंभ में पंक्ति शून्य है तो बिटमैप में एक बिट 1 और है वह 0 है।

चर आकार के लिए एसिटिक आकार 0 बाइट्स है।

निश्चित आकार के डेटाटाइप के लिए, एक्यूअल साइज़ डिफ़ॉल्ट मूल्य में डिफ़ॉल्ट डेटाटाइप आकार है (संख्याओं के लिए 0, वर्णों के लिए ')।


आप के लिए कहने का मतलब है कि नटवर (अधिकतम) varchar (अधिकतम) Null की तरह Null 0 बाइट्स लेगा और उदाहरण के लिए, chars आदि यह डिफ़ॉल्ट मानों को उनके पास डिफ़ॉल्ट आकार में ले जाएगा?
रॉकी सिंह

4

NULL मान संग्रहीत करना कोई स्थान नहीं लेता है।

"तथ्य यह है कि, एक NULL मान अंतरिक्ष पर कब्जा कर लेता है - 2 बाइट्स।"

यह एक गलत धारणा है - यह प्रति पंक्ति 2 बाइट्स है , और मुझे पूरा यकीन है कि सभी पंक्तियाँ उन 2 बाइट्स का उपयोग करती हैं, चाहे कोई भी अशक्त कॉलम हो।

डेटाबेस में एक NULL वैल्यू एक सिस्टम वैल्यू है जो स्टोरेज के एक बाइट को लेता है

यह सामान्य रूप से डेटाबेस के बारे में बात कर रहा है, विशेष रूप से SQL सर्वर नहीं। SQL सर्वर NULL मान को संग्रहीत करने के लिए 1 बाइट का उपयोग नहीं करता है।

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