এসকিউএল সার্ভারে "নাল" মানটি কত আকার নেয়


118

আমার কাছে 10 টি কলামযুক্ত একটি বড় টেবিল রয়েছে। এর মধ্যে 4 টি বেশিরভাগ সময় শূন্য থাকে। আমার কাছে একটি কোয়েরি রয়েছে যা নাল মানটি কোনও আকার বা কোনও আকার বাইটে নেয় না। আমি কয়েকটি নিবন্ধ পড়েছি তাদের মধ্যে কিছু বলছেন:

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

একটি ভ্রান্ত ধারণা রয়েছে যে আমাদের যদি একটি টেবিলের মধ্যে NULL মান থাকে তবে এটি স্টোরেজ স্পেস দখল করে না। আসল বিষয়টি হ'ল একটি নুল মান স্থান দখল করে - 2 বাইট

এসকিউএল: ডিফল্ট মানগুলির তুলনায় নুল মান ব্যবহার করে

NULLডাটাবেসগুলিতে একটি মান হ'ল একটি সিস্টেম মান যা স্টোরেজের এক বাইট নেয় এবং ইঙ্গিত করে যে কোনও মান একটি স্থান বা শূন্য বা অন্য কোনও ডিফল্ট মানের বিপরীতে উপস্থিত হয় না।

আপনি দয়া করে নাল মান দ্বারা নেওয়া আকার সম্পর্কে আমাকে গাইড করতে পারেন?

উত্তর:


146

ক্ষেত্রটি প্রস্থের সংরক্ষণের স্থির হয়ে থাকলে NULL অন্য যে কোনও মানের - ক্ষেত্রের প্রস্থ হিসাবে একই স্থান নেয় takes

ক্ষেত্রটি পরিবর্তনশীল প্রস্থের হলে NULL মানটি কোনও স্থান নেয় না।

নাল মান সংরক্ষণ করার জন্য প্রয়োজনীয় স্থানের পাশাপাশি একটি কমানো কলাম থাকার জন্য একটি ওভারহেডও রয়েছে। প্রতিটি কাতারের জন্য সেই কলামটির মান নাল বা না তা চিহ্নিত করার জন্য একটি নল কলাম প্রতি এক বিট ব্যবহৃত হয়। কলামটি স্থির বা পরিবর্তনশীল দৈর্ঘ্যের কিনা তা সত্য।


অন্যান্য উত্স থেকে প্রাপ্ত তথ্যগুলিতে আপনি যে মতবিরোধগুলি দেখেছেন সেগুলির কারণ:

  • প্রথম নিবন্ধটির শুরুটি কিছুটা বিভ্রান্তিকর। নিবন্ধটি একটি নুল মান সংরক্ষণ করার জন্য ব্যয় করছে না, তবে ক্ষমতা রাখার ব্যয় সম্পর্কে বলছে না (অর্থাত্ একটি কলামকে বাতিল করতে হবে)। এটি সত্য যে কোনও কলামকে শোধনযোগ্য করতে স্টোরেজ স্পেসে কিছু খরচ হয়, তবে আপনি একবার এটি করার পরে কোনও মান (ভেরিয়েবল প্রস্থের কলামগুলির জন্য) সঞ্চয় করার চেয়ে NUL সঞ্চয় করতে কম জায়গা লাগে।

  • দ্বিতীয় লিঙ্কটি মাইক্রোসফ্ট অ্যাক্সেস সম্পর্কে একটি প্রশ্ন বলে মনে হচ্ছে। অ্যাক্সেস কীভাবে NULL সঞ্চয় করে তার বিশদ জানি না তবে এসকিউএল সার্ভারের থেকে আলাদা হয়ে থাকলে আমি অবাক হব না।


1
@ মার্ক "এটি সত্য যে কোনও কলামকে অবিচ্ছেদ্য করতে স্টোরেজ স্পেসে কিছু খরচ হয়, তবে একবার আপনি এটি করেন যে কোনও মান সংরক্ষণের ক্ষেত্রে (পরিবর্তনশীল প্রস্থের কলামগুলির জন্য) তুলনামূলকভাবে NUL সঞ্চয় করতে কম জায়গা লাগে" এটির অর্থ আপনার অর্থ পরিবর্তনশীল ডেটাটাইপগুলির জন্য মেমরিতে নেওয়া আকার হিসাবে এটি 1 বিট নেয়।
রকি সিং

13
বেশিরভাগ কম্পিউটার সিস্টেমে মেমরির ক্ষুদ্রতম ঠিকানাযোগ্য ইউনিট একটি byte(সাধারণত 8 বিট)। সুতরাং বাস্তবে, একটি bitলাগে a byte। দুর্দান্ত উত্তর চিহ্নিত করুন: +1।
জনবি

20
তবে, একটি দ্বিতীয় বিট, এবং একটি তৃতীয় বিট, এবং অষ্টম বিট পর্যন্ত সমস্ত উপায় একই বাইটে ফিট fit
মাত্তি ভির্ককুনেন

1
@ মার্ক - হ্যাঁ এটি অনেক পরিষ্কার দেখাচ্ছে। অদৃশ্য মন্তব্যের জন্য দুঃখিত। আমি এটি সংশোধন করতে চেয়েছিলাম কিন্তু আমার ইন্টারনেট সংযোগ মুছে ফেলা এবং জমা দেওয়ার মধ্যে চলে গেছে! এটি কিছুটা নির্ভর করে (এখানে মন্তব্য বিভাগ থেকে) "হিপ এবং ক্লাস্টারড ইনডেক্স রেকর্ডের জন্য, সবসময় একটি নুল বিটম্যাপ থাকে non নন-ক্লাস্টারযুক্ত সূচিগুলির জন্য, সূচীতে সমস্ত কলামগুলি শূন্য না হলে সেখানে থাকবে না।"
মার্টিন স্মিথ

2
@ মার্টিন স্মিথ: আমি এটা জানতাম না। এটি বিষয়গুলিকে আরও জটিল করে তোলে কারণ যদি আমি এটি সঠিকভাবে বুঝতে পারি তবে এর অর্থ হ'ল একটি কলাম কমাতে পারার ফলে প্রয়োজনীয় স্টোরেজ স্পেস বাড়বে না (কারণ নাল বিটম্যাপ সর্বদা উপস্থিত থাকে) যদি না যে কলামটি কোনও সূচীতে না থাকে এবং সূচীতে অন্যান্য কলামগুলি থাকে অযোগ্য নয়। এই ক্ষেত্রে সূচকে অবশ্যই একটি নাল বিটম্যাপ অন্তর্ভুক্ত করতে হবে।
মার্ক বাইয়ার্স

30

নীচের লিঙ্কটি দাবি করেছে যে কলামটি যদি পরিবর্তনশীল দৈর্ঘ্য হয়, varcharতবে NULLতার পরে 0 বাইট লাগে (মান 1 টি বাইট মান হয় NULLকি না তা পতাকাঙ্কিত করতে ব্যবহৃত হয় ):

উপরের লিঙ্কটি এবং নীচের লিঙ্কটি দাবি করে যে স্থির দৈর্ঘ্যের কলামগুলির জন্য, char(10)বা int, NULLকলামটির দৈর্ঘ্য একটি মান দখল করে (প্লাস 1 বাইটটি পতাকাঙ্কিত করতে হবে NULLবা না):

উদাহরণ:

  1. আপনি যদি একটি সেট করেন তাহলে char(10)থেকেNULL , এটা দখল করে 10 বাইট (আউট zeroed)
  2. একটি int লাগে 4 বাইট (এছাড়াও শূন্য আউট)।
  3. একটি varchar(1 million)সেট NULL0 বাইট নেয় (+ 2 বাইট)

দ্রষ্টব্য: কিছুটা স্পর্শকাতর স্থানে, স্টোরেজের আকার varcharহ'ল + 2 বাইট প্রবেশ করা ডেটার দৈর্ঘ্য।


একটি ন্যুআরএল স্টোর করা কোনও বার্চার কি 0 + 2 + 1 (ন্যূন ওভারহেড) বাইট নিতে পারে?
আকাশ

এটি NUL ফ্ল্যাগ করতে + 1 বিট হওয়া উচিত । @ আকাশ: 2 বাইট প্রয়োজনীয় হওয়া উচিত নয় কারণ বিটম্যাপটি ইতিমধ্যে NULL হিসাবে মানটি পতাকাঙ্কিত করে (কোনও তথ্য যোগ করা হবে না)।
সিমো কিভিস্টি

5

এই লিঙ্ক থেকে :

প্রতিটি সারিতে কলামগুলির জন্য নাল বিটম্যাপ রয়েছে যা নালগুলিকে মঞ্জুরি দেয়। যদি সেই কলামের সারিটি শূন্য হয় তবে বিটম্যাপে কিছুটা 1 টি অন্য 0 টি।

পরিবর্তনশীল আকারের ডেটাটাইপগুলির জন্য অ্যাক্টুয়াল আকারটি 0 বাইট।

স্থির আকারের ডেটাটাইপের জন্য অ্যাক্টুয়াল আকার হ'ল ডিফল্ট মান নির্ধারণ করা বাইটগুলিতে ডেটাটাইপ আকার (সংখ্যার জন্য 0, '' অক্ষরের জন্য)।


আপনি বলতে চাইছেন nvarchar (সর্বোচ্চ) বার্চারের (সর্বোচ্চ) নুলের জন্য ডেটাটাইপগুলির জন্য নুল 0 বাইট লাগবে এবং অন্তর্, অক্ষর ইত্যাদির জন্য এটি তাদের পূর্বনির্ধারিত মানগুলিতে ডিফল্ট আকারটি গ্রহণ করবে?
রকি সিং

4

একটি নুল মান সংরক্ষণ করা কোনও স্থান নেয় না।

"আসল বিষয়টি হ'ল, একটি নূন্যমূল্য স্থানটি দখল করে - 2 বাইট" "

এটি একটি ভুল ধারণা - এটি প্রতি সারি 2 বাইট , এবং আমি নিশ্চিত যে সমস্ত সারিগুলি 2 টি বাইট ব্যবহার করবে যে কোনও কলাযুক্ত কলাম নেই তা নির্বিশেষে।

ডাটাবেসে একটি নুল মান হ'ল একটি সিস্টেম মান যা স্টোরেজটির এক বাইট নেয়

এটি সাধারণভাবে ডেটাবেস সম্পর্কে কথা বলছে, বিশেষত এসকিউএল সার্ভার নয়। এসকিউএল সার্ভার নুল মান সংরক্ষণ করতে 1 বাইট ব্যবহার করে না।

আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.