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
Freigeben: 2025-01-06 13:25:40
Original
644 Leute haben es durchsucht

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);
Nach dem Login kopieren

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()'
Nach dem Login kopieren

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"}]';
Nach dem Login kopieren

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);
Nach dem Login kopieren

Materialisierte Ansichtsabfrage:

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

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!

Quelle:php.cn
Erklärung dieser Website
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
Neueste Artikel des Autors
Beliebte Tutorials
Mehr>
Neueste Downloads
Mehr>
Web-Effekte
Quellcode der Website
Website-Materialien
Frontend-Vorlage