5つのブール列を持つテーブルがあります。行の90%以上では、すべての列がnullです。 (False
は、私にとってはnull
と同等です。)
ブール列の代わりに、列挙されたカスタムデータ型の配列を含む単一の配列列を使用して、null以外の列のみを格納することもできます。
配列を使用するのは変だと思いますが、同僚からは、配列を使用することには大きな理由はないことが指摘されており、空の列をたくさん保存していないため、配列を使用することによる節約が実際に見られる場合があります。
配列を使用することの欠点はありますか?具体的には、それらはより多くのスペースを使用しますか、クエリにより多くの時間を費やしますか、またはPostgres機能(例えば、ジンインデックス)が使用されないようにしますか?
TL; DR:not配列を使用しないでください。個々のboolean
列を使用します。
同僚は実際のストレージ要件を認識していない場合があります。 Postgresではnullストレージは非常に安価で効率的です。
いくつかのboolean
列も非常に安価で効率的です-null可能かどうか。実際には、_NOT NULL
_が定義されていても、5つのboolean
列だけが行サイズに影響することはほとんどありません。各1バイト、5バイト、アライメント制限なし。ほとんど関係ありません。通常、行に対して実行できるはるかに重要なことがあります。 (実際のテーブル定義を提供しておく必要があります。)
配列のオーバーヘッドは24バイトです。プラス実際のデータ。そして、処理ははるかに不便ではるかに高価です:
この関連する回答には、3つの関連オプションの詳細な評価があります。
boolean
列を分離するinteger
bit(n)
またはbit varying(n)
)あなたの場合、 Bit String Type データ型の使用を検討できます。たとえば、次のようなものです。
CREATE TABLE yourtable (
booleans bit[5] default B'00000',
... other fields ... )
メモリの点で効率的で、PostgreSQL配列(実際にはitビット配列)などの複雑な型を使用する必要がありません。 、falseとnullの違いに注意を払う必要はありません(必要に応じて、フィールド全体をnull値に設定することもできます)。