PostgreSQL では、NULL 可能列は追加のスペースを占有しますか? 質問する

PostgreSQL では、NULL 可能列は追加のスペースを占有しますか? 質問する

7 列のテーブルがあり、そのうち 5 列は null になります。、、、、およびデータ型に null 列があります。このテーブルには、int多数のnull を含む数百万の行が含まれます。null 値がスペースを占有するのではtextないかと心配しています。datebooleanmoney

また、Postgres が null 値をインデックスするかどうかご存知ですか? null をインデックスしないようにしたいと思います。

ベストアンサー1

基本的に、NULL価値観は1ビットNULL ビットマップ内にあります。しかし、それはそれほど単純ではありません。

ヌルビットマップ(行ごとに) は、その行の少なくとも 1 つの列に値が含まれている場合にのみ割り当てられますNULL。これにより、9 列以上のテーブルでは一見矛盾した効果が発生する可能性があります。列に最初のNULL値を割り当てると、値を書き込むよりも多くのディスク領域が使用される可能性があります。逆に、行から最後の NULL 値を削除すると、NULL ビットマップも削除されます。

物理的には、初期のヌルビットマップは1バイトHeapTupleHeader(23バイト)と実際の列データまたは行OID(まだ使用している場合)の間- これはいつも倍数から始まるMAXALIGN(通常は8バイト)。これにより1バイト初期の null ビットマップによって利用されるパディング。

事実上、8列以下のテーブルではNULLストレージは完全に無料です(削除されたがまだ消去されていない列を含む)。
その後、別のバイト (通常は 8 バイト) が次の列 (通常は 64 バイト)MAXALIGNに割り当てられます。など。MAXALIGN * 8

詳細情報マニュアルに以下の関連する質問をご覧ください:

データ型のアライメント パディングを理解すると、ストレージをさらに最適化できます。

しかし、かなりの量のスペースを節約できるケースはまれです。通常、その努力に見合う価値はありません。

@ダニエルインデックス サイズへの影響についてはすでに説明しています。

注記それドロップされた列(現在は見えませんが) テーブルが再作成されるまでシステム カタログに保持されます。これらのゾンビは、(拡大された) NULL ビットマップの割り当てを強制する可能性があります。以下を参照してください。

おすすめ記事