テーブルに次のように定義された列があるとします。
"MyColumn" smallint NULL
0、1 などの値を保存するには 2 バイト (1) が必要です。しかし、「MyColumn」を NULL に設定した場合、どれだけのスペースが必要ですか? 0 バイト必要でしょうか?
管理目的などで、各列/行に追加で必要なバイトはありますか?
(1)http://www.postgresql.org/docs/9.0/interactive/datatype-numeric.html
ベストアンサー1
ララミービットマップについては正しく、マニュアル内の適切な場所にリンクしています。しかし、これはほぼ正しいですが、完全に正しいわけではありません。
したがって、1 つ以上の null を含む任意の行に追加されるサイズは、ビットマップのサイズ (N 列のテーブルの場合は N ビット、切り上げ) になります。
データの配置を考慮する必要があります。HeapTupleHeader
(行あたり)は23バイトを占め、実際の列データは常に(通常は8バイト)の倍数で始まりますMAXALIGN
。そのため、ヌルビットマップで使用できるパディングの1バイトが残ります。8列までのテーブルではnullストレージは完全に無料です。
その後、別のMAXALIGN
(通常は8)バイトが次の(通常は64)列に割り当てられますMAXALIGN * 8
。など。常にユーザー列の合計数(全部かゼロか)。ただし、行に実際の null 値が少なくとも 1 つある場合のみです。
特に、システム カタログにまだリストされているpg_attribute
(削除済みとしてマークされている) 削除された列も、ヌル ビット マップの 1 ビットを占有します。VACUUM FULL
この残留物を取り除くことはできず、ダンプ/復元サイクルでのみ可能です。(したがって、テーブル列を定期的に追加および削除するアンチパターンには注意してください。)
これらすべてを確認するために、広範囲にわたるテストを実行しました。詳細: