Heim >Datenbank >MySQL-Tutorial >Wie optimiere ich Postgres-JSONB-Array-Abfragen mit GIN-Indizes?

Wie optimiere ich Postgres-JSONB-Array-Abfragen mit GIN-Indizes?

Patricia Arquette
Patricia ArquetteOriginal
2025-01-06 13:25:40647Durchsuche

How to Optimize Postgres JSONB Array Queries with GIN Indexes?

So verwenden Sie GIN-Indizes mit JSONB-Arrays in Postgres

Problem:
Bei der Abfrage von JSONB-Arrays in Postgres, ein GIN-Index mit events_gin_idx ON some_table USING GIN (events); Möglicherweise werden Abfragen, die nach bestimmten Array-Elementen suchen, nicht optimiert.

Ursache:
Die Abfrage konvertiert die Array-Elemente mithilfe von jsonb_array_elements(events) AS e in JSON-Array-Elemente, was die Funktion stört Indizierung.

Richtige Indizierung für Postgres 12 oder Später:
Um einen GIN-Index zu erstellen, der Abfragen mit Pfadausdrücken unterstützt, verwenden Sie die Operatorklasse jsonb_path_ops:

CREATE INDEX locations_events_gin_idx ON locations USING gin (events jsonb_path_ops);

Abfragesyntax für Postgres 12 oder höher:
Verwenden Sie das @? Operator zum Testen auf Array-Elemente, die einer Bedingung entsprechen:

SELECT *
FROM locations
WHERE events @? '$[*] ? (@.event_slug == "test_1")
                      ? (@.end_time.datetime() < "2014-10-13".datetime()'

Abfragesyntax für ältere Versionen von Postgres:
Für Versionen vor Postgres 12 können Sie das @> verwenden ; Operator mit einem partiellen JSON-Objekt:

SELECT *
FROM locations
WHERE events @> '[{ "event_slug": "test_1"}]';

Erweiterte Lösung mit materialisierter Ansicht:
Wenn die grundlegenden Indizierungslösungen nicht leistungsfähig genug sind, sollten Sie die Erstellung einer materialisierten Ansicht in Betracht ziehen:

CREATE MATERIALIZED VIEW loc_event AS
SELECT l.location_id, e.event_slug, e.end_time  -- start_time not needed
FROM locations l, jsonb_populate_recordset(null::event_type, l.events) e;

CREATE INDEX loc_event_idx ON loc_event (event_slug, end_time, location_id);

Materialisierte Ansichtsabfrage:

SELECT *
FROM loc_event
WHERE event_slug = 'test_1'
AND end_time >= '2014-10-30 14:04:06 -0400'::timestamptz;

Das obige ist der detaillierte Inhalt vonWie optimiere ich Postgres-JSONB-Array-Abfragen mit GIN-Indizes?. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!

Stellungnahme:
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn