web-dev-qa-db-ja.com

PostgreSQL:固定キーでのhstore trgm検索

各製品のカスタムプロパティを持つ製品の表があります。ので、私は持っています props::hstoreテーブルの列。ユーザーが最初にキーを選択し、次にオートコンプリート機能で値を入力することにより、キー/値で製品を検索できるようにしたいと思います。だから私はここに2つのステップが必要です:

  1. propsフィールドのすべてのキーを取得します。 SELECT DISTINCT with skeysはここで機能するはずですが、インデックスの作成方法がわかりません。
  2. 固定キーの最も関連性の高い値を検索します(オートコンプリート機能)。しかし、gin_trgm_opsはvalueでのみインデックスを作成でき、valueでは固定キーのインデックスを作成できないようです。

また、hstorejsonbで変更することは良い考えかもしれませんが、なぜそれがよりパフォーマンスが良いのかわかりません。

1
Ximik

多くの行があるテーブルのhstore(またはjsonb)列全体で使用されるキーの個別の名前をすべて取得するパフォーマンスの高い方法はありません。個別のキーのリストを完全に最新にする必要がない場合は、マテリアライズドビューを使用できます。しかし、より一般的には、キーと値のペアを非正規化された形式ではなく、実際のリレーショナルテーブルに格納する必要があります。

1
jjanes

異なるキーが10〜20個しかない場合、至急同じ行のキーごとに1つの個別の列を検討します。未使用のキーはNULLのままです。関連ケース:

つまり、そこに方法があり、ドキュメントタイプ列から個別のキー名のリストを取得しますjsonbまたはhstoreのように比較的速く:

キー名(または連結された文字列)のソートされた配列にbtree式インデックスを作成し、それを再帰CTEでトラバースして、ルーズインデックススキャンをエミュレートし、の個別のセットから個別のキーのセットを圧縮しますキーの組み合わせ

これは、すべての_1000 combinations_ではなく、(理想的にはインデックスのみのスキャンで)_10kk of rows_の1000個のインデックスタプルを読み取ります。 factor 10kの違い。

IMMUTABLEakeys()のように、インデックスのキーの配列またはリストを抽出するhstore関数が必要です。

配列のbtreeインデックスが役立つことはほとんどありません。これはまれなケースです。

関連するコード例:

2