Erstellen Sie einen partiellen, mehrspaltigen Index mit dieser bestimmten Sortierreihenfolge:
CREATE INDEX products_status_sales_partial_idx ON products (status, sales DESC)
WHERE category NOT IN ('cat3','cat7');
Ändern Sie Ihre Abfrage leicht:
SELECT product_no, sales
FROM products
WHERE status = 'something'
AND category NOT IN ('cat3', 'cat7')
ORDER BY status, sales DESC
LIMIT 3;
Hinzufügen von status
als erstes Element des ORDER BY
Klausel erscheint überflüssig und sinnlos. Aber probiere es aus.
Warum?
Der Abfrageplaner ist nicht schlau genug, um zu verstehen, dass mit
WHERE status = 'something' ...
ORDER BY sales DESC
die Sortierreihenfolge des Index (status, sales DESC)
Übereinstimmungen als logische Konsequenz. Es wird also alle gelesen qualifizierende Zeilen, sortiere und wähle die Top 3 aus.
Durch Hinzufügen von status
zum ORDER BY
Sie ermöglichen dem Abfrageplaner, die obersten 3 Einträge direkt aus dem Index zu lesen. Erwarten Sie eine Beschleunigung um mehrere Größenordnungen .
Getestet mit PostgreSQL 8.4 und 9.1.