PostgreSQL
 sql >> Database >  >> RDS >> PostgreSQL

Indice multicolonna su 3 campi con tipi di dati eterogenei

Indice a colonna singola

Postgres può combinare più indici in modo molto efficiente in una singola query con scansioni di indici bitmap . Nella maggior parte dei casi, viene selezionato l'indice più selettivo (o due, combinato con le scansioni dell'indice bitmap) e il resto viene filtrato. Una volta che il set di risultati è sufficientemente ristretto, non è efficiente eseguire la scansione di più indici.

Indice multicolonna

È ancora più veloce avere un indice multicolonna perfettamente corrispondente, ma non per ordini di grandezza.
Dato che vuoi includere un tipo di matrice Suggerisco di utilizzare un GIN indice. AFAIK, mancano le classi operatore per gli indici GiST generici sul tipo di array. (L'eccezione è intarray per integer matrici.)

Per includere il integer colonna, prima installa il modulo aggiuntivo btree_gin , che fornisce le classi di operatori GIN necessarie. Esegui una volta per database :

CREATE EXTENSION btree_gin;

Quindi dovresti essere in grado di creare il tuo indice multicolonna:

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

L'ordine delle colonne dell'indice è irrilevante per gli indici GIN. Il manuale:

Un indice GIN multicolonna può essere utilizzato con condizioni di query che coinvolgono qualsiasi sottoinsieme delle colonne dell'indice. A differenza di B-tree o GiST, l'efficacia della ricerca nell'indice è la stessa indipendentemente dalla colonna o dalle colonne dell'indice utilizzate dalle condizioni della query.

Ricerca vicino più vicino

Dal momento che stai includendo una geometry PostGis digita, è probabile che tu voglia eseguire una ricerca del vicino più vicino, per la quale hai bisogno di un GiST indice. In questo caso ne suggerisco due indici:

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);

Potresti aggiungere il integer colonna c a uno o entrambi. Dipende. Per questo, hai bisogno di btree_gin o btree_gist o entrambi, rispettivamente.