वाह, सही उत्तर "जब आपको प्रदर्शन करने की आवश्यकता न हो तो NULLs की अनुमति न दें क्योंकि वे प्रदर्शन को नीचा दिखा रहे हैं" किसी भी तरह से अंतिम मूल्यांकन किया गया उत्तर है। मैं इसे उभारूंगा और विस्तृत करूंगा। जब एक RDBMS गैर-विरल कॉलम के लिए NULLs की अनुमति देता है, तो उस कॉलम को एक बिटमैप में जोड़ा जाता है जो यह ट्रैक करता है कि क्या मूल्य प्रत्येक व्यक्तिगत पंक्ति के लिए NULL है। इसलिए तालिका में एक स्तंभ में NULL-क्षमता जोड़कर जहां सभी कॉलम NULLs की अनुमति नहीं देते हैं, आप तालिका को सहेजने के लिए आवश्यक संग्रहण स्थान बढ़ा रहे हैं। इसके अलावा, आपको बिटमैप को पढ़ने और लिखने के लिए RDBMS की आवश्यकता होती है, जो सभी कार्यों पर प्रदर्शन को कम करता है।
इसके अलावा, कई उदाहरणों में, NULLs 3NF को तोड़ने की अनुमति देगा। जबकि मैं अपने कई सहयोगियों की तरह 3NF के लिए एक स्टिकर नहीं हूं, निम्नलिखित परिदृश्य पर विचार करें:
व्यक्ति तालिका में एक स्तंभ है, जिसे DateOfDeath कहा जाता है, जो कि अशक्त है। यदि किसी व्यक्ति की मृत्यु हो गई है, तो यह उनके DateOfDeath के साथ भरा जाएगा, अन्यथा इसे NULL छोड़ दिया जाएगा। एक गैर-अशक्त सा स्तंभ भी है, जिसे IsAlive कहा जाता है। यदि व्यक्ति जीवित है तो यह कॉलम 1 पर सेट है, और यदि व्यक्ति मृत है। संग्रहीत प्रक्रियाओं के विशाल बहुमत ने IsAiveive कॉलम का उपयोग किया है, वे केवल तभी देखभाल करते हैं जब कोई व्यक्ति जीवित होता है, न कि उनका DateOfDeath।
हालाँकि, IsAlive कॉलम डेटाबेस के सामान्यीकरण को तोड़ देता है, क्योंकि यह DateOfDeath से पूरी तरह से व्युत्पन्न है। लेकिन चूंकि IsAlive SPs के बहुमत में हार्ड-वायर्ड है, इसलिए सीधा उपाय है कि DateOfDeath को गैर-अशक्त बना दिया जाए, और उस व्यक्ति के स्तंभ में एक डिफ़ॉल्ट मान असाइन किया जाए जो अभी भी जीवित है। कुछ SPs जो DateOfDeath का उपयोग करते हैं, फिर IsAlive कॉलम की जांच करने के लिए फिर से लिखा जा सकता है, और यदि व्यक्ति जीवित नहीं है, तो केवल DateOfDeath का सम्मान करें। फिर से, चूंकि अधिकांश SP केवल IsAlive (एक बिट) के बारे में परवाह करते हैं, न कि DateOfDeath (एक तारीख) का उपयोग करके इस पैटर्न का उपयोग काफी तेजी से होता है।
सभी स्कीमाओं में बिना NULLs वाले अशक्त स्तंभ खोजने के लिए एक उपयोगी T-SQL स्क्रिप्ट है:
select 'IF NOT EXISTS (SELECT 1 FROM ' + QUOTENAME(s.name) + '.' + QUOTENAME(t.name) + ' WHERE ' + QUOTENAME(c.name) + ' IS NULL)
AND (SELECT COUNT(*) FROM ' + QUOTENAME(s.name) + '.' + QUOTENAME(t.name) + ') > 1 PRINT ''' + s.name + '.' + t.name + '.' + REPLACE(c.name, '''', '''''') + ''''
from sys.columns c
inner join sys.tables t ON c.object_id = t.object_id
inner join sys.schemas s ON s.schema_id = t.schema_id
where c.is_nullable = 1 AND c.is_computed = 0
order by s.name, t.name, c.name;
यदि आप इसे अपने उत्पादन डेटाबेस की एक प्रति पर चलाते हैं, तो आप उन स्तंभों को पा सकते हैं जिन्हें NULL को अनुमति देने के रूप में चिह्नित किया गया है, जिनका कोई NULLs अभ्यास में नहीं है। इनमें से अधिकांश को NULL के रूप में चिह्नित नहीं किया जा सकता है, जिससे प्रदर्शन में वृद्धि होती है और भंडारण स्थान कम होता है।
सभी तालिकाओं में सभी NULL को समाप्त करना संभव नहीं है और अभी भी एक साफ डिजाइन हो सकता है, लेकिन यथासंभव अधिक NULLs को समाप्त करने में काफी फायदा है। ऑप्टिमाइज़र इस जानकारी के साथ बहुत तेज़ी से काम करता है, और यदि आप एक तालिका में सभी NULL को समाप्त कर सकते हैं तो आप काफी मात्रा में भंडारण स्थान प्राप्त कर सकते हैं।
मुझे पता है कि प्रदर्शन कुछ ऐसा नहीं है जो डीबीए सोचता है कि सभी के बारे में बहुत कुछ है, लेकिन आप केवल एक सीमित मात्रा में मेमोरी और प्रोसेसर पावर को एक समाधान पर फेंक सकते हैं, कुछ बिंदु जो आप तार्किक और शारीरिक डिजाइन के बारे में सोचना शुरू करेंगे। ।
यह भी ध्यान दें कि यह केवल सच्चे RDBMSes के लिए है और मैं SQL सर्वर से अपने उत्तरों के तकनीकी हिस्से को आधार बना रहा हूं। Nulls के बिना अशक्त स्तंभों को खोजने के लिए सूचीबद्ध T-SQL भी SQL सर्वर से है।