PostgreSQLビット文字列を使用する必要がありますか?


18

私はbit string最近データ型について学んでおり、私は非常に興味があります:

  1. このドキュメントページの下部にの文があります

    ...プラス文字列の長さに応じて5または8バイトのオーバーヘッド

  2. PHP、Java、C#、C ++などの他の言語では、Npgsql、ODBCなどのドライバーを介して、ビット文字列はどのように処理されますか。

質問1では、smallintまたはbigintを使用すると、ストレージの効率が大幅に向上し、整数はどこでもサポートされるため、パフォーマンスが向上する可能性があります。ほとんどのプログラミング言語は、整数のビット操作を簡単に処理します。その場合、ビット文字列データ型を導入するポイントは何ですか?大量のビットマスクが必要な場合のみですか?多分ビットフィールドのインデックス?PostgreSQLでビットフィールドのインデックス付けがどのように行われるかについて、もっと興味があります。

#2については、私は混乱しています。たとえば、平日ビットマスクをbit(7)フィールドに格納すると、1日1ビットで、最下位ビットが月曜日を表します。次に、PHPとC ++で値を照会します。私は何を得ますか?ドキュメントには、ビット文字列があると書かれていますが、ビット文字列は整数のように直接使用できるものではありません。この場合、ビットフィールドを放棄する必要がありますか?

誰かがビットまたはビット可変を使用する理由とタイミングを詳しく説明できますか?



2
SOに関するErwinの答えは素晴らしいです(そして@Erwinでコピーしてもかまわないなら、ここに置いておくと便利です)が、私は自分の注意を付けたいと思います:ほとんどの場合、あなたは情報を保存することを考えないでしょうRDBMSのビット文字列-ストレージの「効率」に関係なく、通常のソリューションで個別のブール列を使用します。
ジャックダグラス

@JackDouglas:答えをコピーしても構いません。しかし、SEサイト間で回答を複製することは良い考えですか?
アーウィンブランドステッター

@Erwin私はなぜそうなのかわかりません-サイト間にいくつかの重複があり、両方ともスタンドアロンになるはずです(したがって、たとえば、私たちはそうしないでしょう-とにかくできませんでした-もしあれば、ここで質問を複製として閉じますSOに関する同一の質問)。私たちの焦点は「専門家」問題にありますが、IMOの答えは現状のカテゴリーに当てはまります:)
ジャックダグラス

@JackDouglas:それは理にかなっています。とにかく、あなたが賛美をすり抜けた後、どうして私は反対することができますか?;)
アーウィンブランドステッター

回答:


18

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

  • インデックス作成は簡単です。特に、式のインデックスは簡単です。
  • クエリと部分インデックスの条件は、書き込みと読み取りが簡単で、意味があります。
  • ブール列は1バイトを占有します。少数の変数についてのみ、これが最小のスペースを占有します。
  • 他のオプションとは異なり、ブール列NULLは必要な場合に個々のビットの値を許可します。定義NOT NULLしない場合は、いつでも列を定義できます。

ストレージの最適化

ハンドフル変数よりも多く、33未満の変数がある場合は、integer最適です。(または、bigint最大64個の変数用。)

  • ディスク上の4バイトを占有します。
  • 完全一致(=演算子)の非常に高速なインデックス作成。
  • 個々の値の処理は、bit stringまたはを使用しbooleanた場合よりも遅く/不便になる場合があります。

でも、より多くの変数を持つ、またはあなたはたくさんの値、またはあなたは、巨大なテーブルやディスクの空き容量がない場合/ RAMは何の問題ではない、またはあなたが選ぶことがわからない場合、私は考えるでしょう操作したい場合bit(n)bit varying(n)

  • 少なくとも5バイト(または非常に長い文字列の場合は8)に加えて、8ビットの各グループに1バイト(切り上げ)を占有します。
  • ビット文字列関数と演算子を直接使用できます。

わずか3ビットの情報の場合、個々のboolean列は3バイトで処理され、integer4バイトとbit string6バイト(5 + 1)が必要です。

ための32ビット情報の、integerまだは、4つのバイトを必要とbit string同じ(5 + 4)のための9つのバイトを占有し、boolean列は32バイトを占めます。

参考文献


はい、あなたに賛成です。現在、私はsamllintを使用して平日のビットマスクを保存しています。ケースに合った、ストレージ効率/パフォーマンスワイド。ただし、ビットマスクでさらにインデックス作成/フィルタリングを行うと、パフォーマンスが低下するため失敗します。
ジャッキーチョン

3

すべてのPostgreSQLタイプは、あるものには役立ちますが、他のものにはあまり役立ちません。一般に、最初に機能性を心配し、後でパフォーマンスを心配する必要がなくなります。PostgreSQLには、さまざまな種類のデータ型を操作するための多数の関数があり、これらも例外ではありません。

アプリケーションレイヤーでは、dbドライバーが何らかの種類の変換によってそれを処理しない限り、文字列表現を取得し、これを処理する必要があります。そのため、その容量では有用な場合とそうでない場合があります。

役に立つ可能性が高いのは、ビット単位演算やビット単位演算などのビット単位演算に基づいてレコードを選択する場合、またはSQLクエリでデータを操作する場合です。これを行わない限り、PostgreSQLのより難解な機能の多くはあまり役に立ちません。

また、バイナリ情報の長い文字列には、ストリーミングなどを実行できる大きなオブジェクトインターフェイスと、よりコンパクトな文字列表現を可能にするbyteaインターフェイスがあります。

tl; dr:あなたがそれを必要とするなら、あなたはそれを知るでしょう。それ以外の場合は、あなたの心の「将来の使用のために予約済み」セクションにそれを捨ててください。

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.