Vytvořte částečný, vícesloupcový index s tímto konkrétním pořadím řazení:
CREATE INDEX products_status_sales_partial_idx ON products (status, sales DESC)
WHERE category NOT IN ('cat3','cat7');
Mírně svůj dotaz upravte:
SELECT product_no, sales
FROM products
WHERE status = 'something'
AND category NOT IN ('cat3', 'cat7')
ORDER BY status, sales DESC
LIMIT 3;
Přidání status
jako první prvek ORDER BY
klauzule se zdá nadbytečná a nesmyslná. Ale zkuste to.
Proč?
Plánovač dotazů není dostatečně chytrý, aby pochopil, že s
WHERE status = 'something' ...
ORDER BY sales DESC
pořadí řazení indexu (status, sales DESC)
shoduje se jako logický důsledek. Takže to bude číst vše kvalifikační řádky, seřaďte a vyberte 3 nejlepší.
Přidáním status
do ORDER BY
povolíte plánovači dotazů číst 3 hlavní položky z indexu přímo. Očekávejte zrychlení o několik řádů .
Testováno s PostgreSQL 8.4 a 9.1.