sql >> データベース >  >> RDS >> PostgreSQL

JSONのPostgreSQLインデックス

    ->>が原因で、他の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でテストする !




    1. SET NULL:SQLcl / SQL*PlusでNULL値が発生した場合に返される文字列を指定します

    2. 日付範囲間の日付を生成する

    3. MySQL用のPerconaサーバーの監視-主要なメトリック

    4. JavaScriptプロキシを使用してSQLiteでブール値を処理する方法