PostgreSQL
 sql >> Datenbank >  >> RDS >> PostgreSQL

Den richtigen Index für die PostgreSQL-Abfrage auswählen

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.