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

PostgreSQL no usa un índice parcial

Un índice parcial es una buena idea para excluir la mitad de las filas de la tabla que obviamente no necesita. Más simple:

CREATE INDEX name_idx ON table (text_col)
WHERE text_col IS NOT NULL;

Asegúrese de ejecutar ANALYZE table después de crear el índice. (Autovacuum lo hace automáticamente después de un tiempo si no lo hace manualmente, pero si prueba justo después de la creación, su prueba fallará).

Luego, para convencer al planificador de consultas de que se puede usar un índice parcial en particular, repita WHERE condición en la consulta, incluso si parece completamente redundante:

SELECT col1,col2, .. colN
FROM   table 
WHERE  text_col = 'my_value'
AND   text_col IS NOT NULL;  -- repeat condition

Voilá.

Por documentación:

Sin embargo, tenga en cuenta que el predicado debe coincidir con las condiciones utilizadas en las consultas que se supone que se beneficiarán del índice. Para ser precisos, un índice parcial se puede usar en una consulta solo si el sistema puede reconocer que el WHERE la condición de la consulta implica matemáticamente el predicado del índice. PostgreSQL no tiene un probador de teoremas sofisticado que pueda reconocer expresiones matemáticamente equivalentes que están escritas en diferentes formas. (Este teorema general no sólo es extremadamente difícil de crear, sino que probablemente sería demasiado lento para tener algún uso real). El sistema puede reconocer implicaciones de desigualdad simples, por ejemplo, "x <1" implica "x <2"; de lo contrario, el predicado la condición debe coincidir exactamente con parte del WHERE de la consulta o el índice no se reconocerá como utilizable. La coincidencia se lleva a cabo en el momento de la planificación de la consulta, no en el momento de la ejecución. Como resultado, las cláusulas de consulta parametrizadas no funcionan con un índice parcial.

En cuanto a las consultas parametrizadas:nuevamente, agregue el predicado (redundante) del índice parcial como un WHERE constante adicional condición, y funciona bien.

Una actualización importante en Postgres 9.6 mejora en gran medida las posibilidades de escaneos de solo índice (lo que puede hacer que las consultas sean más baratas y el planificador de consultas elegirá más fácilmente tales planes de consulta). Relacionado:

  • PostgreSQL no usa el índice durante el conteo (*)