Índice de una sola columna
Postgres puede combinar múltiples índices de manera muy eficiente en una sola consulta con escaneos de índice de mapa de bits . La mayoría de las veces, se selecciona el índice más selectivo (o dos, combinados con exploraciones de índice de mapa de bits) y el resto se filtra. Una vez que el conjunto de resultados es lo suficientemente estrecho, no es eficiente escanear más índices.
Índice de varias columnas
Todavía es más rápido tener un índice de varias columnas perfectamente coincidente, pero no por órdenes de magnitud.
Ya que desea incluir un tipo de matriz Sugiero usar un GIN índice. AFAIK, faltan clases de operadores para índices GiST de uso general en el tipo de matriz. (La excepción es intarray
para integer
matrices.)
Para incluir el integer
columna, primero instale el módulo adicional btree_gin
, que proporciona las clases de operadores GIN necesarias. Ejecutar una vez por base de datos :
CREATE EXTENSION btree_gin;
Entonces debería poder crear su índice de varias columnas:
CREATE INDEX tbl_abc_gin_idx ON tbl USING GIN(a, b, c);
El orden de las columnas de índice es irrelevante para los índices GIN. El manual:
Un índice GIN de varias columnas se puede usar con condiciones de consulta que involucran cualquier subconjunto de las columnas del índice. A diferencia de B-tree o GiST, la eficacia de la búsqueda de índices es la misma independientemente de qué columna(s) de índice utilicen las condiciones de consulta.
Búsqueda de vecino más cercano
Dado que está incluyendo una geometry
de PostGis tipo, lo más probable es que desee realizar una búsqueda de vecino más cercano, para lo cual necesita un GiST índice. En este caso sugiero dos índices:
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);
Podría agregar el integer
columna c
a uno o ambos. Depende. Para eso, necesitas btree_gin
o btree_gist
o ambos, respectivamente.