Skapa ett partiellt index med flera kolumner med denna speciella sorteringsordning:
CREATE INDEX products_status_sales_partial_idx ON products (status, sales DESC)
WHERE category NOT IN ('cat3','cat7');
Ändra din fråga något:
SELECT product_no, sales
FROM products
WHERE status = 'something'
AND category NOT IN ('cat3', 'cat7')
ORDER BY status, sales DESC
LIMIT 3;
Lägger till status
som första element i ORDER BY
klausul verkar överflödig och meningslös. Men ge det ett försök.
Varför?
Frågeplaneraren är inte smart nog att förstå, det där med
WHERE status = 'something' ...
ORDER BY sales DESC
sorteringsordningen för indexet (status, sales DESC)
matchar som en logisk konsekvens. Så den kommer att läsa alla kvalificerande rader, sortera och välj de 3 bästa.
Genom att lägga till status
till ORDER BY
du gör det möjligt för frågeplaneraren att läsa de tre bästa posterna från indexet direkt. Räkna med en snabbare ökning med flera storleksordningar .
Testad med PostgreSQL 8.4 och 9.1.