2017-06-02 14 views
3

私はjsonbをpostgresに格納しています。postgres jsonbカラムのGINインデックスはネストされていますか?

{ 
    "name": "Mr. Json", 
    "dept":{ 
    "team":{ 
     "aliases":["a1","a2","a3"], 
     "team_name": "xyz" 
    }, 
    "type":"engineering", 
    "lead":"Mr. L" 
    }, 
    "hobbies": ["Badminton", "Chess"], 
    "is_active": true 
} 

てきたが、私はタイプ=「工学」とリード= '氏を含むすべての行のような完全一致のクエリを実行する必要があり、列

にGINインデックスを作成しました。 L 'である。 私は現在のような封じ込めのクエリを行っています:

data @> '{"dept":{"type":"engineering"}}' and data @> '{"dept":{"lead":"Mr. L"}}' 

私はGINインデックスが使用されている示してクエリプランを見ましたが、私はこれが動作するかどうかわからない午前またはこれを達成するためのいくつかのより良い方法があるかどうか。

ネストされたキーで別のインデックスを作成する必要がありますか?

jsonb列をインデックスすると、ネストされたキーまたは最上位レベルのインデックスが作成されますか?

また、この情報を参考にしてください。 docsから

+0

なぜ 'data @> '{" dept ":{" lead ":" Mr。L "、" type ":" engineering "}}'というのはなぜですか?クエリはインデックスを2回使用しますが、これは同等ですが1回のみ使用します。 – pozs

答えて

4

jsonbのデフォルトのGIN演算子クラスはトップレベルをオペレータに-が存在するキーのクエリをサポートし、? &および?演算子とパス/値 - 存在演算子@>。

封じ込めの場合は、@>はネストされた値で動作します。他の演算子では、トップレベルキーまたは式インデックスで使用されているどのレベルでも動作します。また、ドキュメンテーションによると、あなたが照会したいレベルで式インデックスを使用する方が、列全体で単純なインデックスより速くなります(サイズが小さくなるにつれて意味をなさなくなります)。

包含検索のみを実行する場合は、インデックス作成中にjsonb_path_opsを使用することを検討してください。それはより小さく、より速いです。

関連する問題