বাহ, সঠিক উত্তর "আপনার যখন প্রয়োজন নেই তখন NUL গুলি মঞ্জুরি দেবেন না কারণ তারা পারফরম্যান্স হ্রাস করে" কোনওভাবে শেষ রেট করা উত্তর। আমি এটি upvote এবং বিস্তৃত করব। যখন কোনও আরডিবিএমএস একটি বিচ্ছিন্ন কলামের জন্য ন্যূনালগুলিকে অনুমতি দেয়, তখন সেই কলামটি একটি বিটম্যাপে যুক্ত হয় যা প্রতিটি পৃথক সারির জন্য মান NULL কিনা তা চিহ্নিত করে। সুতরাং একটি টেবিলের একটি কলামে NULL- ক্ষমতা যুক্ত করে যেখানে সমস্ত কলামগুলি NULL অনুমতি দেয় না, আপনি টেবিলটি সংরক্ষণের জন্য প্রয়োজনীয় সঞ্চয় স্থানটি বাড়িয়ে দিচ্ছেন। আরও, আপনি আরডিবিএমএস বিটম্যাপটি পড়তে এবং লেখার জন্য প্রয়োজনীয়, সমস্ত ক্রিয়াকলাপে কর্মক্ষমতা হ্রাস করে।
তদ্ব্যতীত, বেশ কয়েকটি উদাহরণে, NULL গুলি 3NF ভেঙে দেবে। যদিও আমি আমার অনেক সহকর্মীর মতো 3NF এর জন্য স্টিকার নই, তবে নিম্নলিখিত পরিস্থিতিটি বিবেচনা করুন:
পার্সন টেবিলটিতে ডেটঅফডিথ নামে একটি কলাম রয়েছে, যা শোধনযোগ্য। যদি কোনও ব্যক্তি মারা যায়, তবে এটি তাদের তারিখআফথের সাথে পূরণ করা হবে, অন্যথায় এটি নূলে ছেড়ে যাবে। ইসলাইভ নামে একটি নন-নাল বিট কলামও রয়েছে। এই ব্যক্তিটি বেঁচে থাকলে এই কলামটি 1 এবং যদি ব্যক্তি মারা যায় তবে 0 তে সেট করা আছে। সর্বাধিক সঞ্চিত প্রক্রিয়া ইসলাইভ কলাম ব্যবহার করে, কেবলমাত্র কোনও ব্যক্তি বেঁচে থাকলে তাদের যত্ন নেওয়া, তাদের ডেটঅফডিথ নয়।
যাইহোক, ইসলাইভ কলামটি ডাটাবেস স্বাভাবিককরণকে ভঙ্গ করে, কারণ এটি ডেটঅফডিথ থেকে সম্পূর্ণরূপে ব্যয়যোগ্য। তবে যেহেতু ইসলাইভ সংখ্যাগরিষ্ঠ এসপিগুলিতে কঠোর-ওয়্যার্ড, তাই সহজ সমাধান হ'ল ডেটঅফডিথকে অযোগ্য করে তোলা এবং ব্যক্তি এখনও জীবিত থাকে সে ক্ষেত্রে কলামটিতে একটি ডিফল্ট মান নির্ধারণ করা হয়। ডেটঅফডিথ ব্যবহার করা কয়েকটি এসপিই আবার ইসলাইভ কলামটি পরীক্ষা করতে আবার লিখতে পারে এবং ব্যক্তি বেঁচে না থাকলে কেবল ডেটঅফডিথকে সম্মান করে। আবার, যেহেতু বেশিরভাগ এসপি এই প্যাটার্নটি ব্যবহার করে কেবল ইসলাইভ (কিছুটা) এবং ডেটঅফডিথ (কোনও তারিখ) না নিয়েই যত্নশীল।
সমস্ত স্কিমা জুড়ে কোনও NULs ছাড়াই অযোগ্য কলামগুলি সন্ধানের জন্য একটি দরকারী টি-এসকিউএল স্ক্রিপ্ট:
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 গুলি হিসাবে অনুশীলন করতে পারেন যার অনুশীলনে কোনও NULL নেই তা হিসাবে চিহ্নিত করা পেতে পারেন। এর বেশিরভাগ অংশকে নাল নয় বলে চিহ্নিত করা যায়, এর ফলে কর্মক্ষমতা বৃদ্ধি এবং স্টোরেজ স্পেস কম হয়।
সমস্ত টেবিলের সমস্ত NULL মুছে ফেলা সম্ভব নয় এবং এখনও একটি পরিষ্কার নকশা থাকতে পারে, তবে যতটা সম্ভব NUL গুলি বর্জন করার যথেষ্ট সুবিধা রয়েছে। অপ্টিমাইজার এই তথ্যটি দিয়ে আরও দ্রুত কাজ করে এবং আপনি যদি কোনও টেবিলের সমস্ত NUL গুলি দূর করতে পারেন তবে আপনি যথেষ্ট পরিমাণে সঞ্চয় স্থান ফিরে পেতে পারেন।
আমি জানি যে পারফরম্যান্স এমন কিছু নয় যা ডিবিএরা এগুলি সম্পর্কে অনেক কিছু মনে করে তবে আপনি কেবলমাত্র একটি সমাধানের মধ্যে সীমিত পরিমাণে মেমরি এবং প্রসেসরের শক্তি নিক্ষেপ করতে পারেন, এমন কিছু বিষয় যা আপনাকে যৌক্তিক এবং শারীরিক নকশা সম্পর্কে চিন্তাভাবনা শুরু করতে হবে ।
এছাড়াও মনে রাখবেন যে এটি কেবল সত্য আরডিবিএমএসের জন্য এবং আমি আমার উত্তরগুলির প্রযুক্তিগত অংশটি এসকিউএল সার্ভার থেকে বন্ধ করে দিচ্ছি। শূন্যতা ছাড়াই শনাক্তযোগ্য কলামগুলি সন্ধান করার জন্য তালিকাভুক্ত টি-এসকিউএল এসকিউএল সার্ভার থেকেও।