Was zeigt ein Abfrageplan?
Ein Abfrageplan zeigt, in welchen Schritten eine Datenbank eine SQL-Abfrage ausführt. Mit dem Wort EXPLAIN lassen Sie ihn anzeigen.
So sehen Sie, wie viel Arbeit eine Abfrage macht, und können sagen, warum eine Schreibweise günstiger ist als eine andere.
Am Ende dieser Lektion
Notiz
Ich kann einen Abfrageplan mit EXPLAIN lesen und sagen, warum eine Abfrage weniger Arbeit macht als eine andere.
Schlüsselwörter
| Begriff | Was er bedeutet |
|---|---|
| Abfrageplan | die Schritte, in denen eine Datenbank eine Abfrage ausführt |
| EXPLAIN | zeigt den Plan, ohne die Abfrage auszuführen |
| Scan | der Schritt, der eine Tabelle liest |
| Filter | der Schritt, der Zeilen nach einer Bedingung behält |
| Join | der Schritt, der Zeilen zweier Tabellen paart |
Die Zellen, die Lernende ausfüllen, bleiben in dieser Vorschau leer.
Explain zeigt die Schritte statt des Ergebnisses
Setzen Sie explain vor eine Abfrage. Die Datenbank führt sie nicht aus, sondern zeigt ihren Abfrageplan.
Der Plan ist eine Reihe von Kästen. Ganz oben steht das Ergebnis, ganz unten stehen die Tabellen. Die Daten fließen von unten nach oben.
Wie die Kästen aussehen, hängt von der Ansicht und der Version ab. Die Schritte sind dieselben.
Die Schritte, die Sie am häufigsten sehen
| Schritt im Plan | Was er tut |
|---|---|
| Scan (Seq Scan) | Liest eine Tabelle, oft nur die benannten Spalten |
| Filters im Scan oder Filter | Behält Zeilen, die die Bedingung erfüllen |
| Join (Hash Join) | Paart Zeilen zweier Tabellen über einen Schlüssel |
| Group By (Aggregate) | Fasst Zeilen zusammen und rechnet sum oder count |
| Projection | Wählt aus, welche Spalten weitergehen |
Die Zellen, die Lernende ausfüllen, bleiben in dieser Vorschau leer.
Probieren Sie es: einen Plan ansehen
-- Der Plan zeigt die Schritte, die Ausführung liefert keine Zeilen.
explain
select kunde_id, sum(betrag_euro) as summe
from bestellungen
where jahr = 2026
group by kunde_id;
-- Streichen Sie die Zeile mit where und vergleichen Sie die Boxen.
Ein Join braucht zwei Scans
Bei einem Join liest der Plan beide Tabellen. Danach paart ein Join-Schritt die Zeilen, deren Schlüssel gleich sind.
Der Join arbeitet mit allen Zeilen, die aus den Scans kommen. Je weniger das sind, desto weniger hat er zu tun.
Suchen Sie im Plan darum nach dem Ort der Bedingung: Steht sie schon im Scan oder erst nach dem Join?
Probieren Sie es: den Plan eines Joins
-- Ein Join braucht zwei Scans und einen Schritt, der die Zeilen paart.
explain
select kunden.name, sum(bestellungen.betrag_euro) as summe
from bestellungen
join kunden on kunden.id = bestellungen.kunde_id
where bestellungen.jahr = 2026
group by kunden.name;
Ein häufiger Fehler
Warnung
Viele glauben, explain führe die Abfrage aus und zeige das Ergebnis. Es zeigt nur den Plan, die Zeilen kommen nicht. Wollen Sie das Ergebnis, lassen Sie explain weg.
Erst filtern macht den Join kleiner
Von acht Bestellungen stammen fünf aus 2026. Filtern Sie zuerst, hat der Join nur fünf Zeilen zu paaren statt acht.
DuckDB schiebt einfache Bedingungen oft selbst in den Scan. Dann zeigt der Plan Filters schon dort, und beide Schreibweisen sehen gleich aus.
Schreiben Sie den Filter trotzdem zuerst: Die Abfrage ist leichter zu lesen, und nicht jede Bedingung lässt sich verschieben.
Probieren Sie es: erst filtern, dann verbinden
-- Erst filtern, dann verbinden: die Form ist klar zu lesen.
with b2026 as (
select kunde_id, betrag_euro
from bestellungen
where jahr = 2026
)
select kunden.name, sum(b2026.betrag_euro) as summe
from b2026
join kunden on kunden.id = b2026.kunde_id
group by kunden.name
order by kunden.name;
-- Ändern Sie 2026 in 2025: Wer hat dann Bestellungen?