Utwórz częściowy, wielokolumnowy indeks z następującym porządkiem sortowania:
CREATE INDEX products_status_sales_partial_idx ON products (status, sales DESC)
WHERE category NOT IN ('cat3','cat7');
Nieznacznie zmodyfikuj zapytanie:
SELECT product_no, sales
FROM products
WHERE status = 'something'
AND category NOT IN ('cat3', 'cat7')
ORDER BY status, sales DESC
LIMIT 3;
Dodawanie status
jako pierwszy element ORDER BY
klauzula wydaje się zbędna i bezcelowa. Ale spróbuj.
Dlaczego?
Planer zapytań nie jest wystarczająco sprytny, aby zrozumieć, że z
WHERE status = 'something' ...
ORDER BY sales DESC
porządek sortowania indeksu (status, sales DESC)
dopasowania jako logiczną konsekwencję. Czyli przeczyta wszystkie kwalifikujące się wiersze, posortuj i wybierz pierwsze 3.
Dodając status
do ORDER BY
umożliwiasz planerowi zapytań odczytywanie trzech pierwszych wpisów bezpośrednio z indeksu. Spodziewaj się przyspieszenia o kilka rzędów wielkości .
Testowane z PostgreSQL 8.4 i 9.1.