2010-11-19 17 views
25

postgresql DBを使用してNULL値を格納するために必要なディスク容量はどれくらいですか?

テーブルの列に次のような定義があるとしましょう。

"MyColumn" smallint NULL 

0,1などの値を格納するには2バイト(1)が必要です。しかし、 "MyColumn"をNULLに設定した場合、どれくらいのスペースが必要ですか? 0バイト必要ですか?

管理目的など、すべての列/行に必要なバイトがいくつかありますか?

(1)http://www.postgresql.org/docs/9.0/interactive/datatype-numeric.html

答えて

31

ヌル列は保存されません。この行には、開始時にビットマップがあり、1つのビットがNULLまたは非NULLであることを示すビットが1つあります。ビットマップは、すべての列が1つの行で非ヌルである場合は省略できます。したがって、1つ以上のヌルを持つ任意の行に対して、それに追加されるサイズはビットマップのサイズになります(切り捨てられたN列テーブルのNビット)。ドキュメントhere

0

それはそれは必要(行の追加など)何かを変更する場合があります。この一つの値を加算し、しかし、それはスペースの大半を占めるテーブルの構造だ1バイト($ 00)を必要とする必要がありますその中のデータの合計よりも多くのスペース。

編集:ララミーは私よりもヌルについての詳細を知っているようだ:)

30

Laramieからの深さの議論で

よりは、ビットマップについての権利であり、彼は、手動で適切な場所にリンクしています。しかし、これは非常に正しいほとんどではなく:

そこで一つ以上のヌルとの任意の所与の行について、 それに加えサイズは、ビットマップ(N列のテーブルのNビットのものであろう切り上げ)。

データ整列を考慮する必要があります。 HeapTupleHeader(行単位)は23バイトで、実際の列データは常にMAXALIGN(通常8バイト)の倍数で始まります。これにより、1バイトのパディングがヌルビットマップによって利用できるようになります。事実上、テーブルの最大ストレージはNULLであり、カラムは最大8列です。

その後、別のMAXALIGN(通常8バイト)が次のMAXALIGN * 8(通常は64個)の列に割り当てられます。等。常にユーザー列の合計数(すべてまたは無し)。ただし、行に少なくとも1つの実際のNULL値がある場合に限ります。

私はそれをすべて検証するために広範なテストを行った。詳細:

+2

大きなテーブルにデフォルト値なしのカラムの追加通常素早い操作です。 8と9の列(または72と73の間で 'MAXALIGN = 8')のしきい値を超えると、速度が遅くなることがありますか? –

+1

@ PatrickBrinich-Langlois:はい、それがメカニズムの可能性のある結果です。物理的な表のサイズも、これらの場合に予想される以上に増加します。死んだタプルのような他の要因が関与しているため、効果は必ずしも直線的ではありません。既存のNULLビットマップ(行ごとに)が別のNULLビットのための領域を持つ場合、テーブルはまったく成長しません。これは一般的なケースです。 –

関連する問題