Laramieはビットマップについて正しく、マニュアルの適切な場所にリンクしています。それでも、これはほとんど正しいですが、完全には正しくありません:
したがって、1つ以上のヌルを含む特定の行の場合、それに追加されるサイズはビットマップのサイズになります(N列のテーブルの場合はNビット、切り上げ)。
データアライメントを考慮に入れる必要があります。 HeapTupleHeader
(行あたり)は23バイトの長さで、実際の列データは常にMAXALIGN
の倍数で始まります (通常は8バイト)。これにより、ヌルビットマップで使用できる1バイトのパディングが残ります。事実上、最大8列のテーブルではNULLストレージは完全に無料です 。
その後、別のMAXALIGN
(通常は8)バイトが次のMAXALIGN * 8
に割り当てられます (通常64)列。など常にユーザー列の総数(すべてまたはなし )。ただし、行に少なくとも1つの実際のNULL値がある場合に限ります。
私はそのすべてを検証するために広範なテストを実行しました。詳細:
- PostgreSQLでNULLを使用しない場合でも、ヘッダーでNULLビットマップを使用しますか?