postgresql DBを使用してNULL値を保存するにはどのくらいのディスク容量が必要ですか? 質問する

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

ベストアンサー1

ララミービットマップについては正しく、マニュアル内の適切な場所にリンクしています。しかし、これはほぼ正しいですが、完全に正しいわけではありません。

したがって、1 つ以上の null を含む任意の行に追加されるサイズは、ビットマップのサイズ (N 列のテーブルの場合は N ビット、切り上げ) になります。

データの配置を考慮する必要があります。HeapTupleHeader(行あたり)は23バイトを占め、実際の列データは常に(通常は8バイト)の倍数で始まりますMAXALIGN。そのため、ヌルビットマップで使用できるパディングの1バイトが残ります。8列までのテーブルではnullストレージは完全に無料です

その後、別のMAXALIGN(通常は8)バイトが次の(通常は64)列に割り当てられますMAXALIGN * 8。など。常にユーザー列の合計数(全部かゼロか)。ただし、行に実際の null 値が少なくとも 1 つある場合のみです。

特に、システム カタログにまだリストされているpg_attribute(削除済みとしてマークされている) 削除された列も、ヌル ビット マップの 1 ビットを占有します。VACUUM FULLこの残留物を取り除くことはできず、ダンプ/復元サイクルでのみ可能です。(したがって、テーブル列を定期的に追加および削除するアンチパターンには注意してください。)

これらすべてを確認するために、広範囲にわたるテストを実行しました。詳細:

おすすめ記事