web-dev-qa-db-ja.com

いくつかのブール値を配列として保存することは意味がありますか?

5つのブール列を持つテーブルがあります。行の90%以上では、すべての列がnullです。 (Falseは、私にとってはnullと同等です。)

ブール列の代わりに、列挙されたカスタムデータ型の配列を含む単一の配列列を使用して、null以外の列のみを格納することもできます。

配列を使用するのは変だと思いますが、同僚からは、配列を使用することには大きな理由はないことが指摘されており、空の列をたくさん保存していないため、配列を使用することによる節約が実際に見られる場合があります。

配列を使用することの欠点はありますか?具体的には、それらはより多くのスペースを使用しますか、クエリにより多くの時間を費やしますか、またはPostgres機能(例えば、ジンインデックス)が使用されないようにしますか?

5
Xodarap

TL; DR:not配列を使用しないでください。個々のboolean列を使用します。


同僚は実際のストレージ要件を認識していない場合があります。 Postgresではnullストレージは非常に安価で効率的です。

いくつかのboolean列も非常に安価で効率的です-null可能かどうか。実際には、_NOT NULL_が定義されていても、5つのboolean列だけが行サイズに影響することはほとんどありません。各1バイト、5バイト、アライメント制限なし。ほとんど関係ありません。通常、行に対して実行できるはるかに重要なことがあります。 (実際のテーブル定義を提供しておく必要があります。)

配列のオーバーヘッドは24バイトです。プラス実際のデータ。そして、処理ははるかに不便ではるかに高価です:

  • PostgreSQLでのスペースの計算と節約

この関連する回答には、3つの関連オプションの詳細な評価があります。

  1. boolean列を分離する
  2. 最大32個のブール値をエンコードするinteger
  3. ビット文字列(bit(n)またはbit varying(n)
8

あなたの場合、 Bit String Type データ型の使用を検討できます。たとえば、次のようなものです。

CREATE TABLE yourtable (
   booleans bit[5] default B'00000',
   ... other fields ... )

メモリの点で効率的で、PostgreSQL配列(実際にはitビット配列)などの複雑な型を使用する必要がありません。 、falseとnullの違いに注意を払う必要はありません(必要に応じて、フィールド全体をnull値に設定することもできます)。

2
Renzo