Maak een gedeeltelijke index met meerdere kolommen met deze specifieke sorteervolgorde:
CREATE INDEX products_status_sales_partial_idx ON products (status, sales DESC)
WHERE category NOT IN ('cat3','cat7');
Pas uw zoekopdracht enigszins aan:
SELECT product_no, sales
FROM products
WHERE status = 'something'
AND category NOT IN ('cat3', 'cat7')
ORDER BY status, sales DESC
LIMIT 3;
status
toevoegen als eerste element van de ORDER BY
clausule lijkt overbodig en zinloos. Maar probeer het eens.
Waarom?
De queryplanner is niet slim genoeg om te begrijpen, dat met
WHERE status = 'something' ...
ORDER BY sales DESC
de sorteervolgorde van de index (status, sales DESC)
overeenkomsten als logisch gevolg. Dus het gaat alles lezen kwalificatierijen, sorteer en kies de top 3.
Door status
toe te voegen naar de ORDER BY
u stelt de queryplanner in staat om de top 3 items rechtstreeks uit de index te lezen. Verwacht een versnelling van verschillende ordes van grootte .
Getest met PostgreSQL 8.4 en 9.1.