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

Postgres combinando múltiples índices

No sé si Pg puede combinar un índice GiST e índices b-tree regulares con un escaneo de índice de mapa de bits, pero sospecho que no. Es posible que obtenga el mejor resultado posible sin agregar un user_id columna a su índice GiST (y, en consecuencia, hacerlo más grande y más lento para otras consultas que no usan user_id ).

Como experimento podrías:

CREATE EXTENSION btree_gist;
CREATE INDEX ix_coords_and_user_id ON test USING GIST (coords, user_id);

lo que probablemente resulte en un gran índice, pero podría impulsar esa consulta, si funciona. Tenga en cuenta que mantener dicho índice ralentizará significativamente INSERT y UPDATE s. Si sueltas el antiguo ix_coords sus consultas utilizarán ix_coords_and_user_id incluso si no filtran en user_id , pero será más lento que ix_coords . Mantener ambos hará que INSERT y UPDATE ralentización aún peor.

Ver btree-gist

(Obsoleto por la edición de la pregunta que cambia la pregunta por completo; cuando se escribió, el usuario tenía un índice de varias columnas, ahora se dividió en dos índices separados ):

Parece que no está filtrando ni ordenando en user_id , solo create_date . Pg no usará (¿no puede?) Solo el segundo término de un índice de varias columnas como (user_id, create_date) , también necesita el uso del primer elemento.

Si desea indexar create_date , cree un índice separado para él. Si usa y necesita el (user_id, create_date) index y generalmente no usa solo user_id solo, vea si puede invertir el orden de las columnas. Alternativamente, cree dos índices independientes, (user_id) y (create_date) . Cuando se necesitan ambas columnas, Pg puede combinar los dos índices independientes utilizando un escaneo de índice de mapa de bits.