web-dev-qa-db-ja.com

SQL Serverでの「Null」値のサイズ

たとえば、10列の大きなテーブルがあります。それらの4つはほとんどの場合nullのままです。 null値が任意のサイズをとるか、バイト単位でサイズをとらないクエリがあります。私はそれらのいくつかが言っているいくつかの記事を読みました:

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

テーブルにNULL値がある場合、ストレージスペースを占有しないという誤解があります。実際、NULL値はスペースを占有します– 2バイト

SQL:NULL値とデフォルト値の使用

データベースのNULL値は、1バイトのストレージを占有するシステム値であり、スペースまたはゼロまたはその他のデフォルト値とは対照的に、値が存在しないことを示します。

Null値がとるサイズについてご案内ください。

112
Rocky Singh

フィールドが固定幅の場合、NULLを格納すると、他の値と同じスペース(フィールドの幅)が使用されます。

フィールドが可変幅の場合、NULL値はスペースを取りません。

Null値を格納するために必要なスペースに加えて、null許容列を持つためのオーバーヘッドもあります。行ごとに、null許容列ごとに1ビットが使用され、その列の値がnullかどうかがマークされます。これは、列が固定長であっても可変長であっても同じです。


他のソースからの情報であなたが観察した矛盾の理由:

  • 最初の記事の冒頭は少し誤解を招く恐れがあります。この記事では、NULL値を格納するコストについてではなく、NULLを格納するために能力を持つコスト(つまり、列をNULL可能にするコスト)について説明しています。カラムをNULL可能にするためにストレージスペースに何かコストがかかるのは事実ですが、一度それを行うと、値を格納する(可変幅カラムの)場合よりもNULLを格納するスペースが少なくなります。

  • 2番目のリンクは、Microsoft Accessに関する質問のようです。 AccessがどのようにNULLを格納するかについての詳細は知りませんが、SQL Serverと異なっていても驚かないでしょう。

140
Mark Byers

次のリンクは、列が可変長の場合、つまりvarcharの場合、NULLは0バイトを使用します(値がNULLかどうかを示すために1バイトが使用されます)。

上記のリンクと以下のリンクは、固定長の列、つまりchar(10)またはintの場合、NULLの値が列の長さを占めることを主張します(プラスNULLかどうかを示す1バイト):

例:

  1. char(10)NULLに設定すると、10バイトを占有します(ゼロになります)
  2. intは4バイトを使用します(ゼロになります)。
  3. NULLに設定されたvarchar(1 million)は0バイト(+ 2バイト)かかります

注:わずかな接線では、varcharのストレージサイズは、入力されたデータの長さ+ 2バイトです。

30
JohnB

このリンクから

各行には、NULLを許可する列用のNULLビットマップがあります。その列の行がnullの場合、ビットマップのビットは1です。それ以外の場合は0です。

可変サイズのデータ​​型の場合、実際のサイズは0バイトです。

固定サイズのデータ​​型の場合、実際のサイズは、デフォルト値に設定されたバイト単位のデフォルトのデータ型サイズです(数値の場合は0、文字の場合は '')。

5
klabranche

NULL値を保存するのにスペースは必要ありません。

「事実、NULL値は2バイトのスペースを占有します。」

これは誤解です-それは2バイト行ごとであり、null許容列があるかどうかに関係なく、すべての行がそれらの2バイトを使用することは間違いありません。

データベースのNULL値は、1バイトのストレージを占有するシステム値です

これは、特にSQL Serverではなく、一般的なデータベースについて述べています。 SQL Serverは、NULL値を格納するために1バイトを使用しません。

4
Gabe