この特定の並べ替え順序で部分的な複数列のインデックスを作成します:
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つのエントリを直接読み取ることができるようにします。 数桁のスピードアップを期待してください 。
PostgreSQL8.4および9.1でテスト済み。