Създайте частичен индекс с няколко колони с този конкретен ред на сортиране:
CREATE INDEX products_status_sales_partial_idx ON products (status, sales DESC)
WHERE category NOT IN ('cat3','cat7');
Променете леко заявката си:
SELECT product_no, sales
FROM products
WHERE status = 'something'
AND category NOT IN ('cat3', 'cat7')
ORDER BY status, sales DESC
LIMIT 3;
Добавяне на status
като първи елемент на ORDER BY
клаузата изглежда излишна и безсмислена. Но опитайте.
Защо?
Планиращият заявки не е достатъчно умен, за да разбере това с
WHERE status = 'something' ...
ORDER BY sales DESC
редът на сортиране на индекса (status, sales DESC)
съвпадения като логично следствие. Така че ще прочете всички квалифициращи редове, сортирайте и изберете първите 3.
Чрез добавяне на status
към ORDER BY
вие разрешавате на програмата за планиране на заявки да чете директно първите 3 записа от индекса. Очаквайте ускоряване с няколко порядъка .
Тестван с PostgreSQL 8.4 и 9.1.