von Markus Winand.

Operationen in PostgreSQL Ausführungsplänen


Index- und Tabellenzugriffe

Seq Scan

Die Operation Seq Scan liest die gesamte Tabelle wie gespeichert. Analog zu TABLE 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-Operation Index Scan entspricht einem INDEX RANGE SCAN gefolgt von einem TABLE ACCESS BY INDEX ROWID in der Oracle Datenbank. Siehe Kapitel 1, „Anatomie eines SQL Indexes.

Die sogenannten Index-Filterprädikate sind ein häufiges Perfor­mance­problem beim Index Scan. PostgreSQL Zugriffs- und Filterprädikate unter­schei­den 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. Ein Bitmap 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 Speicherreihen­folge.

engl. Original von Tom Lane

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 Zwischen­er­geb­nis 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 Zwischen­er­geb­nis (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.

Vorherige SeiteNächste Seite

Du kannst nicht alles an einem Tag lernen. Abonniere den Newsletter via E-Mail, Twitter oder RSS um sukzessive aufzuholen. Und sieh dir auch modern-sql.com an.

Über den Autor

Foto von Markus Winand

Markus Winand gibt auf modern-sql.com Einblick in SQL und zeigt, wie es von verschiedenen Systemen unterstützt wird. Zuvor machte er use-the-index-luke.com, was er noch immer wartet. Markus kann als Trainer, Sprecher und Berater auf winand.at engagiert werden.

Sein Buch kaufen

Titelbild von „SQL Performance Explained“: Eichhörnchen läuft durchs Grass

Die Essenz: SQL-Tuning auf 200 Seiten

Jetzt Kaufen
(Taschenbuch und/oder PDF)

Sein Training

Markus verwandelt veraltetes SQL-92-Wissen in solides und zeitgemäßes SQL-Know-how

Erfahren Sie mehr»

Mit Markus Winand verbinden

Markus Winand auf LinkedInMarkus Winand auf XINGMarkus Winand auf Twitter
„Use The Index, Luke!“ von Markus Winand ist unter einer Creative Commons Attribution-Noncommercial-No Derivative Works 3.0 Unported License lizenziert.
Impressum | Kontakt | KEINE GEWÄHR | Handelsmarken | Datenschutz und DSGVO | CC-BY-NC-ND 3.0 Lizenz