2012-04-03 15 views
13

いくつかの状態を決定するいくつかのブール型列を持つPostgreSQLデータベースのテーブルを使って作業しています(例えばpublishedvisibleなど)。私は、ビットマスクの形でこれらのすべての値と可能な新しい値を保存する単一のステータス列を作成したいと思います。この場合、integerbit(n)に違いはありますか?ビットマスクの整数型とビット(n)データ型に違いはありますか?

これは、ユーザーがWebインターフェイス経由で作成するオブジェクトを格納するため、かなり大きなテーブルになります。ですから、私はこの列に(部分的な)インデックスを使わなければならないと思います。

答えて

21

変数がいくつかある場合私は別々のboolean列を保持することを検討します。

  • インデックスは簡単です。特にindexes on expressionsおよびpartial indexesでもある。
  • クエリの条件は、書きやすく読みやすく、意味があります。
  • ブール型の列は1バイトを占めます(境界線のパディングなし)。わずかな変数に対しては、これは最小のスペースしか占有しません。
  • 他のオプションとは異なり、booleanカラムでは、必要な場合は個々のビットの値をNULLとすることができます。必要に応じて列NOT NULLを定義することもできます。あなたは手よりも完全な変数が、をお持ちの場合は

せいぜい32integer最高のサービスを提供しないことがあります。 (64個の変数までbigintため。)

  • は、ディスク上の4バイト(前の列に応じて、アライメントパディングを必要とし得る)を占めます。
  • 完全一致のインデックス作成が非常に高速です(=演算子)。
  • 個々の値の処理は、varbitまたはbooleanを使用する場合よりも遅くなります。

さらに多くの変数を使用する場合や、値をたくさん操作したい場合や、巨大なテーブルやディスクスペースがない場合は、RAMは問題ではありません。私はbit(n) or bit varying(n) (short: varbit(n)と考えます。

、個々boolean列が3バイト、integerニーズ4バイト(多分追加のアライメントパディング)とbit string 6バイト(5 + 1)とすることにより得ます。32ビット情報のについて

は、integerはまだbit stringは同じ(5 + 4)のための9つのバイトを占有し、boolean列は32バイトを占有し、4バイト(+パディング)を必要とします。

さらにディスク容量を最適化するには、PostgreSQLのストレージメカニズム、特にデータアライメントを理解する必要があります。 More in this related answerタイプブールを変換する方法について

This answerビット(N)整数も、助けになることができます。

+0

説明のためにありがとう、それは私が必要としたものです!私は '整数'の列に行くと思います。 –

0

bit string functionsをビットストリングに直接適用することはできますが、整数からキャストする必要はありません。

関連する問題