各製品のカスタムプロパティを持つ製品の表があります。ので、私は持っています props::hstore
テーブルの列。ユーザーが最初にキーを選択し、次にオートコンプリート機能で値を入力することにより、キー/値で製品を検索できるようにしたいと思います。だから私はここに2つのステップが必要です:
props
フィールドのすべてのキーを取得します。 SELECT DISTINCT
with skeys
はここで機能するはずですが、インデックスの作成方法がわかりません。value
でのみインデックスを作成でき、value
では固定キーのインデックスを作成できないようです。また、hstore
をjsonb
で変更することは良い考えかもしれませんが、なぜそれがよりパフォーマンスが良いのかわかりません。
多くの行があるテーブルのhstore(またはjsonb)列全体で使用されるキーの個別の名前をすべて取得するパフォーマンスの高い方法はありません。個別のキーのリストを完全に最新にする必要がない場合は、マテリアライズドビューを使用できます。しかし、より一般的には、キーと値のペアを非正規化された形式ではなく、実際のリレーショナルテーブルに格納する必要があります。
異なるキーが10〜20個しかない場合、至急同じ行のキーごとに1つの個別の列を検討します。未使用のキーはNULLのままです。関連ケース:
つまり、そこにが方法があり、ドキュメントタイプ列から個別のキー名のリストを取得しますjsonb
またはhstore
のように比較的速く:
キー名(または連結された文字列)のソートされた配列にbtree式インデックスを作成し、それを再帰CTEでトラバースして、ルーズインデックススキャンをエミュレートし、の個別のセットから個別のキーのセットを圧縮しますキーの組み合わせ。
これは、すべての_1000 combinations
_ではなく、(理想的にはインデックスのみのスキャンで)_10kk of rows
_の1000個のインデックスタプルを読み取ります。 factor 10kの違い。
IMMUTABLE
のakeys()
のように、インデックスのキーの配列またはリストを抽出するhstore
関数が必要です。
配列のbtreeインデックスが役立つことはほとんどありません。これはまれなケースです。
関連するコード例: