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

Elegir el índice correcto para la consulta de PostgreSQL

Cree un índice parcial de varias columnas con este orden de clasificación particular:

CREATE INDEX products_status_sales_partial_idx ON products (status, sales DESC)
WHERE  category NOT IN ('cat3','cat7');

Modifique ligeramente su consulta:

SELECT product_no, sales 
FROM   products 
WHERE  status = 'something'
AND    category NOT IN ('cat3', 'cat7') 
ORDER  BY status, sales DESC 
LIMIT  3;

Agregando status como primer elemento del ORDER BY cláusula parece redundante y sin sentido. Pero pruébalo.

¿Por qué?

El planificador de consultas no es lo suficientemente inteligente como para comprender que con

WHERE  status = 'something' ...
ORDER  BY sales DESC

el orden de clasificación del índice (status, sales DESC) coincidencias como consecuencia lógica. Así que va a leer todo filas calificadas, ordene y elija las 3 primeras.

Agregando status al ORDER BY permite que el planificador de consultas lea las 3 entradas principales del índice directamente. Espere una aceleración de varios órdenes de magnitud .

Probado con PostgreSQL 8.4 y 9.1.