Index- und Tabellenzugriffe
- Seq Scan
Die Operation
Seq Scan
liest die gesamte Tabelle wie gespeichert. Analog zuTABLE ACCESS FULL
bei der Oracle Datenbank.- Index Scan
Ein
Index Scan
durchwandert den Index-Baum, folgt anschließend den Index-Blättern, um alle Treffer zu finden, und lädt passende Zeilen aus der Tabelle. Die PostgreSQL-OperationIndex Scan
entspricht einemINDEX RANGE SCAN
gefolgt von einemTABLE ACCESS BY INDEX ROWID
in der Oracle Datenbank. Siehe Kapitel 1, „Anatomie eines SQL Indexes“.Die sogenannten Index-Filterprädikate sind ein häufiges Performanceproblem beim
Index Scan
. „PostgreSQL Zugriffs- und Filterprädikate unterscheiden“ erklärt, wie man sie identifiziert.- Index Only Scan (ab PostgreSQL 9.2)
Die PostgreSQL-Operation
Index Only Scan
durchwandert den Index-Baum und folgt anschließend den Index-Blättern, um alle Treffer zu finden. Da der benutzte Index bereits alle benötigten Spalten beinhaltet, ist kein Tabellenzugriff notwendig (Ausnahme: MVCC Sichtbarkeits-Information). Siehe „Index-Only-Scan: Den Tabellenzugriff vermeiden“.- Bitmap Index Scan / Bitmap Heap Scan / Recheck Cond
Tom Lane‘s Erklärung auf der PostgreSQL-Performance-Mailingliste ist sehr kurz und klar.
Ein einfacher
Index Scan
lädt einen Tupel-Zeiger nach dem anderen aus dem Index und greift sofort auf das entsprechende Tupel in der Tabelle zu. EinBitmap Scan
lädt alle Tupel-Zeiger auf einmal aus dem Index, benutzt eine Bitmap-Struktur, um sie im Hauptspeicher zu sortieren, und lädt die Tabellen-Tupel entsprechend der physischen Speicherreihenfolge.
Hinweis in eigener Sache
Ich biete SQL Schulungen, Optimierung und Beratung an. Auch der Kauf meines Buches „SQL Performance Explained“ (ab €9,95) unterstützt meine Arbeit an dieser Webseite.
Join-Operationen
Join-Operationen verbinden grundsätzlich nur zwei Tabellen auf einmal. Falls mehrere Join-Operationen in einer Abfrage vorkommen, werden sie schrittweise durchgeführt; zuerst zwei Tabellen, dann das Zwischenergebnis mit der nächsten. Insofern kann der Begriff „Tabelle“ im Folgenden auch ein Zwischenergebnis bezeichnen.
- Nested Loops
Verbindet zwei Tabellen, indem es für jede Zeile aus der ersten Tabelle eine Abfrage auf die zweite macht. Siehe „Nested Loops – verschachtelte Schleifen“.
- Hash Join / Hash
Der Hash-Join lädt die möglicherweise passenden Zeilen aus der einen Tabelle in ein assoziatives Array (im Ausführungsplan mit „Hash“ markiert), das dann für jede Zeile der zweiten Tabelle abgefragt wird. Siehe „Hash-Join“.
- Merge Join
Der Merge-Join verbindet zwei Tabellen wie ein Reißverschluss. Beide Tabellen müssen vorsortiert sein. Siehe „Sort-Merge“.
Sortieren und Gruppieren
- Sort / Sort Key
Sortiert das Ergebnis wie im Sort Key angegeben. Diese Operation benötigt Speicher zum Materialisieren des Zwischenergebnis (keine Ausführung „am Fließband“). Siehe „
ORDER BY
indizieren“.- GroupAggregate
Sortiert und gruppiert das Ergebnis entsprechend der
group by
-Klausel. Diese Operation benötigt Speicher zum Materialisieren des Zwischenergebnisses (keine Ausführung „am Fließband“). Siehe „GROUP BY
indizieren“.- HashAggregate
Führt eine Gruppierung mit einer Hash-Tabelle durch. Diese Operation benötigt Speicher zum Materialisieren des Zwischenergebnisses (keine Ausführung „am Fließband“). Die Ausgabe erfolgt in keiner bestimmten Reihenfolge. Siehe „
GROUP BY
indizieren“.
Top-N-Abfragen
Die Effizienz einer Top-N-Abfrage hängt von den abgebrochenen Operationen ab. Es ist sehr ineffizient, Operationen abzubrechen, die nicht „am Fließband“ ausgeführt werden (z. B. Sort
).
- Limit
Bricht die Ausführung ab, sobald die gewünschte Anzahl an Zeilen gefunden wurde. Siehe „Top-N-Zeilen abfragen“.
- WindowAgg
Zeigt die Anwendung einer Window-Funktion an. Ab PostgreSQL 15 zeigt die „Run Condition“ einen möglichen Top-N-Abbruch an. Siehe „Mit Window-Funktionen blättern“.