sql >> Base de Datos >  >> RDS >> PostgreSQL

Índice multicolumna en 3 campos con tipos de datos heterogéneos

Í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.