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.