2017-01-04 2 views
1

Ich habe noch nie zuvor GIN Indexierung verwendet und ich versuche zu verstehen, wie es funktioniert. Ich habe eine statische Tabelle mit 4 Millionen Zeilen, die ich SELECT-Abfragen mit WHERE-Klauseln ausführen muss.Wie verwendet man GIN-Indizes in Postgresql

Im Moment hat meine Tabelle einen B-Tree-Index für die Spalte "name", der in der WHERE-Klausel verwendet wird.

Ich habe gelesen, dass eine Volltextsuche mit einem GIN-Index die Geschwindigkeit erheblich verbessern kann. Ich habe das Tutorial here gelesen und momentan bin ich mir nicht sicher, ob ich das verwenden kann, wenn ich nur eine Tabelle habe.

Funktioniert die Volltextsuche bei mehreren Tabellen, denen wir beitreten möchten?

Ich verstehe, dass die GIN-Indizierung auf einer Tsvector-Spalte funktioniert. Dies ist, was ich bisher getan haben:

Ich habe meine Tabelle geändert und hinzugefügt eine Spalte mehr: tsv:

ALTER TABLE my_table ADD COLUMN tsv tsvector; 

ich einen GIN-Index auf meine ts_vector Spalte createad:

CREATE INDEX tsv_idx ON my_table USING gin(to_tsvector('english', name)); 

Und ich habe die Spalte aktualisiert:

UPDATE my_table SET tsv = to_tsvector(name) 

Sind die oben genannten korrekt? Also jetzt, wenn ich die folgende Abfrage ausführen möchte:

Wie kann ich es mit dem GIN-Index tun?

Ich versuchte dies:

SELECT clm1, clmn2 FROM my_table WHERE tvs LIKE 'Ath%' ORDER BY 1 

Aber ich erhalte eine Fehlermeldung:

ERROR: operator does not exist: tsvector ~~ unknown 

Was soll ich hier fehlt? Was ist der richtige Gebrauch von GIN? Und kann ich Volltextsuche auf einer einzigen Tabelle anwenden?

Antwort

1

Sie müssen für das, was Sie abfragen möchten, indexieren. Ein Tsvector hilft dir nicht mit einer like Suche. Da dies jedoch ein Präfix ist, würde ein Standard-btree funktionieren. Wenn Sie eine Infix-Suche durchführen möchten (where mycol like '%something%'), müssen Sie die Erweiterung pg_trgm verwenden und einen Trigramm-GIN-Index erstellen.

Achten Sie genau darauf, was to_tsvector zurückgibt, und notieren Sie, dass Sie indexieren. Was Sie indizieren, gibt Ihrer Anfrage nichts.

+1

Danke. Schließlich habe ich die Erweiterung pg_trgm zusammen mit dem GIN-Index verwendet. Ich habe den Index wie folgt erstellt: CREATE INDEX my_index ON my_table USING gin (Name COLLATE pg_catalog. "Default" gin_trgm_ops); Mit dem Befehl EXPLAIN wurde sichergestellt, dass der Index verwendet wird und die Geschwindigkeit erheblich verbessert wurde. – user1919

+0

Jetzt versuche ich, andere Wege zu finden, um die Dinge zu beschleunigen. Z.B. materialisierte Ansichten oder Server-Seitencursor (wie ich psycopg2 verwende). – user1919

Verwandte Themen