Buat indeks multikolom parsial dengan urutan pengurutan khusus ini:
CREATE INDEX products_status_sales_partial_idx ON products (status, sales DESC)
WHERE category NOT IN ('cat3','cat7');
Ubah kueri Anda sedikit:
SELECT product_no, sales
FROM products
WHERE status = 'something'
AND category NOT IN ('cat3', 'cat7')
ORDER BY status, sales DESC
LIMIT 3;
Menambahkan status
sebagai elemen pertama dari ORDER BY
klausa tampaknya berlebihan dan tidak ada gunanya. Tapi cobalah.
Mengapa?
Perencana kueri tidak cukup pintar untuk memahami bahwa dengan
WHERE status = 'something' ...
ORDER BY sales DESC
urutan pengurutan indeks (status, sales DESC)
cocok sebagai konsekuensi logis. Jadi itu akan membaca semua baris yang memenuhi syarat, urutkan dan pilih 3 teratas.
Dengan menambahkan status
ke ORDER BY
Anda mengaktifkan perencana kueri untuk membaca 3 entri teratas dari indeks secara langsung. Harapkan percepatan sebesar beberapa kali lipat .
Diuji dengan PostgreSQL 8.4 dan 9.1.