2017-07-11 4 views
0

Ich habe die folgende Abfrage:PostgreSQL-Index für jsonb @> Suche

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

EXPLAIN ANALYZE kehrt folgende Ergebnisse:

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) 

Ich möchte auf client Schlüssel in raw Feldindex hinzufügen, so wird die Suche schneller. Ich weiß nicht, wie ich es machen soll. Wenn ich Index für ganze raw Spalte wie folgt hinzu:

CREATE INDEX test_index on survey_results USING GIN (raw); 

dann funktioniert alles wie erwartet. Ich will Index für ganzes raw nicht hinzufügen, weil ich viele Aufzeichnungen in der Datenbank habe und ich nicht seine Größe vergrößern möchte.

Antwort

2

Wenn Sie JSON-Objekte als atm im Beispiel verwenden, dann können Sie Index nur client so angeben:

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

Aber da Sie @> Operator in Ihrer Abfrage verwenden, dann in Ihrem Fall ist es sinnvoll erstellen Index nur für den Betreiber wie folgt aus:

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

mehr sehen von der Dokumentation über Postgres JSONB indexing:

Verwandte Themen