たとえば、10列の大きなテーブルがあります。それらの4つはほとんどの場合nullのままです。 null値が任意のサイズをとるか、バイト単位でサイズをとらないクエリがあります。私はそれらのいくつかが言っているいくつかの記事を読みました:
http://www.sql-server-citation.com/2009/12/common-mistakes-in-sql-server-part-4.html
テーブルにNULL値がある場合、ストレージスペースを占有しないという誤解があります。実際、NULL値はスペースを占有します– 2バイト
データベースの
NULL
値は、1バイトのストレージを占有するシステム値であり、スペースまたはゼロまたはその他のデフォルト値とは対照的に、値が存在しないことを示します。
Null値がとるサイズについてご案内ください。
フィールドが固定幅の場合、NULLを格納すると、他の値と同じスペース(フィールドの幅)が使用されます。
フィールドが可変幅の場合、NULL値はスペースを取りません。
Null値を格納するために必要なスペースに加えて、null許容列を持つためのオーバーヘッドもあります。行ごとに、null許容列ごとに1ビットが使用され、その列の値がnullかどうかがマークされます。これは、列が固定長であっても可変長であっても同じです。
他のソースからの情報であなたが観察した矛盾の理由:
最初の記事の冒頭は少し誤解を招く恐れがあります。この記事では、NULL値を格納するコストについてではなく、NULLを格納するために能力を持つコスト(つまり、列をNULL可能にするコスト)について説明しています。カラムをNULL可能にするためにストレージスペースに何かコストがかかるのは事実ですが、一度それを行うと、値を格納する(可変幅カラムの)場合よりもNULLを格納するスペースが少なくなります。
2番目のリンクは、Microsoft Accessに関する質問のようです。 AccessがどのようにNULLを格納するかについての詳細は知りませんが、SQL Serverと異なっていても驚かないでしょう。
次のリンクは、列が可変長の場合、つまりvarchar
の場合、NULL
は0バイトを使用します(値がNULL
かどうかを示すために1バイトが使用されます)。
上記のリンクと以下のリンクは、固定長の列、つまりchar(10)
またはint
の場合、NULL
の値が列の長さを占めることを主張します(プラスNULL
かどうかを示す1バイト):
例:
char(10)
をNULL
に設定すると、10バイトを占有します(ゼロになります)int
は4バイトを使用します(ゼロになります)。NULL
に設定されたvarchar(1 million)
は0バイト(+ 2バイト)かかります注:わずかな接線では、varchar
のストレージサイズは、入力されたデータの長さ+ 2バイトです。
このリンクから :
各行には、NULLを許可する列用のNULLビットマップがあります。その列の行がnullの場合、ビットマップのビットは1です。それ以外の場合は0です。
可変サイズのデータ型の場合、実際のサイズは0バイトです。
固定サイズのデータ型の場合、実際のサイズは、デフォルト値に設定されたバイト単位のデフォルトのデータ型サイズです(数値の場合は0、文字の場合は '')。
NULL値を保存するのにスペースは必要ありません。
「事実、NULL値は2バイトのスペースを占有します。」
これは誤解です-それは2バイト行ごとであり、null許容列があるかどうかに関係なく、すべての行がそれらの2バイトを使用することは間違いありません。
データベースのNULL値は、1バイトのストレージを占有するシステム値です
これは、特にSQL Serverではなく、一般的なデータベースについて述べています。 SQL Serverは、NULL値を格納するために1バイトを使用しません。