実際にはそれよりも複雑です。
nullビットマップには、行の列ごとに1ビットが必要であり、フルバイトに切り上げられます。実際の行に少なくとも1つのNULL値が含まれている場合にのみ存在し、その場合は完全に割り当てられます。 NOT NULL
制約はそれに直接影響しません。 (もちろん、テーブルのすべてのフィールドがNOT NULL
の場合 、nullビットマップは存在できません。)
「ヒープタプルヘッダー」(行ごと)の長さは23バイトです。実際のデータは、MAXALIGN
の倍数で始まります (最大データアライメント )その後、これは通常64ビットOSでは8バイト(32ビットOSでは4バイト)です。ルートとしてPostgreSQLバイナリディレクトリから次のコマンドを実行して、決定的な答えを取得します。
./pg_controldata /path/to/my/dbcluster
Postgres 12の典型的なDebianベースのインストールでは、次のようになります。
sudo /usr/lib/postgresql/12/bin/pg_controldata /var/lib/postgresql/12/main
いずれにせよ、ヘッダーとデータの整列された開始の間に1バイトの空きバイトがあり、これをnullビットマップが利用できます。テーブルに8列以下がある限り 、NULLストレージは事実上完全に無料 (ディスク容量に関する限り)
その後、別のMAXALIGN
(通常8バイト)は、別の(通常)64フィールドをカバーするためにヌルビットマップに割り当てられます。など
これは少なくともバージョン8.4〜12で有効であり、ほとんどの場合変更されません。