PostgreSQL
 sql >> Datenbank >  >> RDS >> PostgreSQL

Mehrspaltiger Index auf 3 Felder mit heterogenen Datentypen

Einspaltiger Index

Postgres kann mehrere Indizes sehr effizient in einer einzigen Abfrage mit Bitmap-Index-Scans kombinieren . Meistens wird der selektivste Index ausgewählt (oder zwei, kombiniert mit Bitmap-Index-Scans) und der Rest wird gefiltert. Sobald die Ergebnismenge schmal genug ist, ist es nicht effizient, weitere Indizes zu scannen.

Mehrspaltiger Index

Es ist immer noch schneller, einen perfekt passenden mehrspaltigen Index zu haben, aber nicht um Größenordnungen.
Da Sie einen Array-Typ einschließen möchten Ich schlage vor, einen GIN zu verwenden Index. AFAIK, Operatorklassen fehlen für allgemeine GiST-Indizes auf Array-Typen. (Die Ausnahme ist intarray für integer Arrays.)

Zum Einschließen der integer Spalte installieren Sie zunächst das Zusatzmodul btree_gin , das die erforderlichen GIN-Operatorklassen bereitstellt. einmal pro Datenbank ausführen :

CREATE EXTENSION btree_gin;

Dann sollten Sie in der Lage sein, Ihren mehrspaltigen Index zu erstellen:

CREATE INDEX tbl_abc_gin_idx ON tbl USING GIN(a, b, c);

Die Reihenfolge der Indexspalten ist für GIN-Indizes irrelevant. Das Handbuch:

Ein mehrspaltiger GIN-Index kann mit Abfragebedingungen verwendet werden, die eine beliebige Teilmenge der Spalten des Index umfassen. Im Gegensatz zu B-Tree oder GiST ist die Indexsucheffektivität gleich, unabhängig davon, welche Indexspalte(n) die Abfragebedingungen verwenden.

Suche nach dem nächsten Nachbarn

Da Sie eine PostGis-geometry einschließen eingeben, möchten Sie wahrscheinlich eine Suche nach dem nächsten Nachbarn durchführen, wofür Sie ein GiST benötigen Index. In diesem Fall schlage ich zwei vor Indizes:

CREATE INDEX tbl_ac_gist_idx ON tbl USING GiST(a, c);  -- geometry type
CREATE INDEX tbl_bc_gin_idx  ON tbl USING GIN(b, c);

Sie könnten die integer hinzufügen Spalte c zu einem oder beiden. Das kommt darauf an. Dazu benötigen Sie entweder btree_gin oder btree_gist oder beides.