Crie um índice parcial de várias colunas com esta ordem de classificação específica:
CREATE INDEX products_status_sales_partial_idx ON products (status, sales DESC)
WHERE category NOT IN ('cat3','cat7');
Modifique sua consulta um pouco:
SELECT product_no, sales
FROM products
WHERE status = 'something'
AND category NOT IN ('cat3', 'cat7')
ORDER BY status, sales DESC
LIMIT 3;
Adicionando
status
como primeiro elemento do ORDER BY
cláusula parece redundante e inútil. Mas dá-lhe uma chance. Por quê?
O planejador de consultas não é inteligente o suficiente para entender que, com
WHERE status = 'something' ...
ORDER BY sales DESC
a ordem de classificação do índice
(status, sales DESC)
correspondências como uma consequência lógica. Então ele vai ler todos linhas qualificadas, classifique e escolha as 3 primeiras. Adicionando
status
para o ORDER BY
você permite que o planejador de consultas leia as 3 principais entradas do índice diretamente. Espere uma aceleração de várias ordens de magnitude . Testado com PostgreSQL 8.4 e 9.1.