7 列のテーブルがあり、そのうち 5 列は null になります。、、、、およびデータ型に null 列があります。このテーブルには、int
多数のnull を含む数百万の行が含まれます。null 値がスペースを占有するのではtext
ないかと心配しています。date
boolean
money
また、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
詳細情報マニュアルに以下の関連する質問をご覧ください:
- postgresql DB を使用して NULL 値を保存するには、どのくらいのディスク容量が必要ですか?
- PostgreSQL で NULL を使用しない場合でも、ヘッダーでは NULL ビットマップが使用されますか?
- Heroku 上の 5 MB の PostgreSQL には何件のレコードを保存できますか?
データ型のアライメント パディングを理解すると、ストレージをさらに最適化できます。
しかし、かなりの量のスペースを節約できるケースはまれです。通常、その努力に見合う価値はありません。
@ダニエルインデックス サイズへの影響についてはすでに説明しています。
注記それドロップされた列(現在は見えませんが) テーブルが再作成されるまでシステム カタログに保持されます。これらのゾンビは、(拡大された) NULL ビットマップの割り当てを強制する可能性があります。以下を参照してください。