Opret et delvist indeks med flere kolonner med denne særlige sorteringsrækkefølge:
CREATE INDEX products_status_sales_partial_idx ON products (status, sales DESC)
WHERE category NOT IN ('cat3','cat7');
Rediger din forespørgsel en smule:
SELECT product_no, sales
FROM products
WHERE status = 'something'
AND category NOT IN ('cat3', 'cat7')
ORDER BY status, sales DESC
LIMIT 3;
Tilføjer status
som første element i ORDER BY
klausul virker overflødig og meningsløs. Men prøv det.
Hvorfor?
Forespørgselsplanlæggeren er ikke smart nok til at forstå, det med
WHERE status = 'something' ...
ORDER BY sales DESC
sorteringsrækkefølgen af indekset (status, sales DESC)
matcher som en logisk konsekvens. Så den kommer til at læse alle kvalificerende rækker, sorter og vælg top 3.
Ved at tilføje status
til ORDER BY
du aktiverer forespørgselsplanlæggeren til at læse de øverste 3 poster fra indekset direkte. Forvent en fremskyndelse med flere størrelsesordener .
Testet med PostgreSQL 8.4 og 9.1.