->>
が原因で、他の2つのインデックスは機能しません。 演算子はtext
を返します 、明らかにjsonb
がありますが ジン演算子クラスを念頭に置いてください。 json
についてのみ言及していることに注意してください 、ただし実際には jsonb
が必要です 高度なインデックス機能用。
最適なインデックス作成戦略を立てるには、対象となるクエリをより厳密に定義する必要があります。あなたは牛だけに興味がありますか?またはすべての動物/すべてのタグ?どのオペレーターが可能ですか? JSONドキュメントには動物以外のキーも含まれていますか?それらをどうするか?牛(または何でも)がJSONドキュメントにまったく表示されない行をインデックスに含めますか?
想定:
- 私たちは、最初のレベルの営巣牛にのみ関心があります。
- 値は常に有効な
integer
。 - 牛のいない列には興味がありません。
すでにお持ちのように、機能的なbtreeインデックスをお勧めしますが、値をinteger
にキャストします。 。比較をtext
として評価したくないと思います (ここで、「2」は「1111」より大きい)。
CREATE INDEX animal_index ON farm (((animal ->> 'cow')::int)); -- !
インデックス式の構文を明確にするために、キャストの省略形には追加の括弧のセットが必要です。
クエリで同じ式を使用して、Postgresにインデックスが適用可能であることを認識させます。
SELECT * FROM farm WHERE (animal ->> 'cow')::int > 3;
より一般的なjsonb
が必要な場合 インデックス、検討:
- Postgres jsonbの配列の構造をクエリするための適切なインデックスは何ですか?
既知、静的、些細な 動物の数(あなたがコメントしたように)、私は次のような部分インデックスを提案します:
CREATE INDEX animal_index ON farm (((animal ->> 'cow')::int))
WHERE (animal ->> 'cow') IS NOT NULL;
CREATE INDEX animal_index ON farm (((animal ->> 'chicken')::int))
WHERE (animal ->> 'chicken') IS NOT NULL;
など
クエリにインデックス条件を追加する必要がある場合があります:
SELECT * FROM farm
WHERE (animal ->> 'cow')::int > 3
AND (animal ->> 'cow') IS NOT NULL;
冗長に見えるかもしれませんが、必要かもしれません。 ANALYZE
でテストする !