2017-07-11 2 views
0

je la requête suivante:index PostgreSQL pour jsonb @> Recherche

SELECT "survey_results".* FROM "survey_results" WHERE (raw @> '{"client":{"token":"test_token"}}'); 

EXPLAIN ANALYZE renvoie les résultats suivants:

Seq Scan on survey_results (cost=0.00..352.68 rows=2 width=2039) (actual time=132.942..132.943 rows=1 loops=1) 
    Filter: (raw @> '{"client": {"token": "test_token"}}'::jsonb) 
    Rows Removed by Filter: 2133 
Planning time: 0.157 ms 
Execution time: 132.991 ms 
(5 rows) 

Je veux ajouter index sur client clé à l'intérieur raw champ de recherche ainsi sera plus rapide. Je ne sais pas comment le faire. Quand j'ajoute l'index pour toute la colonne raw comme ceci:

CREATE INDEX test_index on survey_results USING GIN (raw); 

alors tout fonctionne comme prévu. Je ne veux pas ajouter l'index pour l'entier raw parce que j'ai beaucoup d'enregistrements dans la base de données et je ne veux pas augmenter sa taille.

Répondre

2

Si vous utilisez des objets JSON comme atmosphère dans l'exemple, vous pouvez spécifier l'index que client comme ça:

CREATE INDEX test_client_index ON survey_results USING GIN ((raw->'client)); 

Mais puisque vous utilisez l'opérateur @> dans votre requête puis dans votre cas, il pourrait être logique pour créer l'index uniquement pour cet opérateur comme ça:

CREATE INDEX test_client_index ON survey_results USING GIN (raw jsonb_path_ops); 

Voir plus de documentation sur Postgres JSONB indexing: