0Pricing
SQL Interview Prep · Lektion

Langsame Abfragen erkennen und beheben

Eine Diagnose-Checkliste für die Interviewfrage „Diese Abfrage ist langsam – beheben Sie sie“.

Langsame Abfragen erkennen und beheben ist eine kostenlose SQL Interview Prep-Lektion auf CoddyKit. Dies ist Lektion 4 von 4. Du kannst die komplette Lektion unten kostenlos lesen – dann übst du sie direkt im Browser mit einem integrierten Code-Editor und einem KI-Tutor rund um die Uhr. Sie ist Teil des SQL Interview Prep-Lernpfads, und dein Fortschritt wird über Web und CoddyKit-App synchronisiert. Der SQL Interview Prep-Kurs umfasst insgesamt 4 Lektionen.

Die Aufforderung „Diese Abfrage ist langsam – beheben Sie sie“

Dies ist die abschließende Interviewaufgabe: Der Interviewer gibt Ihnen eine langsame Abfrage und einen EXPLAIN ANALYZE-Plan und bittet Sie, die Ursache zu diagnostizieren. Geprüft wird eine Methode, keine auswendig gelernten Tricks.

Eine gute Antwort folgt laut einer Checkliste: messen, den Plan lesen, die dominanten Kosten finden, eine Hypothese aufstellen, eine Lösung vorschlagen und sie überprüfen. Diese Lektion baut diese Checkliste Schritt für Schritt auf.

Bleiben Sie systematisch und erläutern Sie Ihre Überlegungen. Genau das bringt Ihnen die Bewertung auf Senior-Level.

Schritt 1: Mit EXPLAIN ANALYZE messen

Raten Sie niemals allein anhand des SQL. Ermitteln Sie den tatsächlichen Plan mit EXPLAIN (ANALYZE, BUFFERS).

ANALYZE liefert tatsächliche Zeiten und Zeilenzahlen; BUFFERS zeigt, ob Sie aus dem Cache lesen oder von der Festplatte. Zusammen zeigen diese Informationen, ob die Abfrage CPU-gebunden oder E/A-gebunden ist oder einfach zu viel Arbeit verrichtet.

Führen Sie den Befehl einige Male aus. Beim ersten Durchlauf kann ein leerer Cache die Zeitmessung verfälschen.

EXPLAIN (ANALYZE, BUFFERS)
SELECT * FROM orders o
JOIN customers c ON c.id = o.customer_id
WHERE o.created_at >= '2026-01-01';

Schritt 2: Den dominanten Knoten finden

Lesen Sie den Plan nicht wahllos von oben nach unten. Suchen Sie den Knoten, an dem tatsächlich die meiste Zeit verbraucht wird.

Berechnen Sie die Eigenzeit jedes Knotens: seine gesamte actual time abzüglich der Zeit seiner untergeordneten Knoten, multipliziert mit loops. Der Knoten mit dem größten Anteil ist Ihr Ziel; alles andere ist nebensächlich.

Sagen Sie im Vorstellungsgespräch: 80 Prozent der Laufzeit entfallen auf diesen einen Seq Scan, deshalb konzentriere ich mich darauf. Alles andere zu optimieren wäre vertane Mühe.

Schritt 3: Geschätzte und tatsächliche Werte vergleichen

Vergleichen Sie am dominanten Knoten die geschätzten mit den tatsächlichen Zeilen. Eine große Abweichung bedeutet, dass der Planer im Blindflug arbeitet und wahrscheinlich einen falschen Plan gewählt hat (falscher Join-Algorithmus, falsche Zugriffsmethode).

Das Beispiel zeigt eine 1000-fache Unterschätzung. Aktualisieren Sie die Statistiken, bevor Sie etwas neu entwerfen. Dieser einzelne Befehl korrigiert den Plan oft kostenlos.

ANALYZE berechnet die Spaltenstatistiken neu; VACUUM ANALYZE bereinigt außerdem veraltete Tupel und aktualisiert die Visibility Map.

-- estimate rows=100, actual rows=120000  -> stale stats
ANALYZE orders;
-- or, for bloated tables:
VACUUM ANALYZE orders;

Häufige Ursache: Funktion auf einer indizierten Spalte

Der häufigste behebbare Fehler: Eine Funktion oder ein Cast umschließt die Spalte in WHERE, sodass der Index nicht verwendet werden kann und die Engine einen Seq Scan ausführt.

Das Beispiel erzwingt einen vollständigen Scan, weil DATE() auf jede Zeile angewendet wird. Formulieren Sie die Bedingung als Bereichsprädikat auf der unveränderten Spalte (sargable Form), dann greift der Index auf created_at.

Dasselbe gilt für WHERE lower(email)=...: Speichern Sie entweder normalisierte Daten, fragen Sie die unveränderte Spalte ab oder erstellen Sie einen Ausdrucksindex.

-- Not sargable: index unusable
WHERE DATE(created_at) = '2026-01-01'

-- Sargable: range over the bare column
WHERE created_at >= '2026-01-01'
  AND created_at <  '2026-01-02'

Häufige Ursache: Fehlender Index

Wenn der dominante Knoten ein Seq Scan mit einem hochselektiven Filter ist oder ein Nested Loop mit sehr vielen loops auf einem nicht indizierten inneren Schlüssel, ist die Lösung normalerweise ein Index.

Erstellen Sie einen Index auf der gefilterten oder verknüpften Spalte. Das Beispiel erstellt einen auf customer_id, sodass der Join von Seq Scans auf Index Scans wechseln kann und der Planer möglicherweise einen deutlich günstigeren Plan auswählt.

Überprüfen Sie das Ergebnis, indem Sie EXPLAIN ANALYZE erneut ausführen. Nehmen Sie nicht einfach an, dass der Index geholfen hat.

CREATE INDEX idx_orders_customer
  ON orders (customer_id);

Häufige Ursache: SELECT * und breite Zeilen

SELECT * liest jede Spalte von der Festplatte und über das Netzwerk und verhindert Index-Only-Scans, weil der Index selten alle Spalten abdeckt.

Wählen Sie nur die benötigten Spalten aus. Dadurch wird die Zeilenbreite kleiner, die E/A-Last sinkt und ein abdeckender Index-Only-Scan kann möglich werden.

Ein Interviewer, der SELECT * gezielt einsetzt, möchte sehen, ob Sie es bemerken. Das Kürzen der Spaltenliste bringt bei breiten Tabellen oft schnell einen echten Vorteil.

-- Before
SELECT * FROM orders WHERE customer_id = 42;

-- After: only needed columns (may enable index-only scan)
SELECT order_id, amount FROM orders WHERE customer_id = 42;

Häufige Ursache: Auslagerung auf die Festplatte

Wenn ein Sort- oder Hash-Knoten Festplattennutzung meldet (Sort Method: external merge Disk: 25000kB oder Batches: > 1), hat der Vorgang work_mem überschritten und wurde auf die Festplatte ausgelagert.

Optionen: Erhöhen Sie work_mem für die Sitzung, verringern Sie die Anzahl der Zeilen, die die Sortierung oder den Hash erreichen (früher filtern), oder fügen Sie einen Index hinzu, der die sortierte Reihenfolge liefert, sodass überhaupt keine Sortierung erforderlich ist.

Das ist eine präzise Diagnose auf Senior-Level, die Interviewer anerkennen.

Sort  (actual rows=2000000 loops=1)
  Sort Key: o.amount
  Sort Method: external merge  Disk: 25000kB

Häufige Ursache: Zu viele Zeilen abrufen

Achten Sie auf Rows Removed by Filter: 9500000. Die Abfrage hat zehn Millionen Zeilen gelesen und fast alle verworfen – ein klassisches Beispiel für unnötige Arbeit.

Mögliche Lösungen: Erstellen Sie einen Index, damit der Filter bereits beim Zugriff angewendet wird (nicht erst danach), formulieren Sie das Prädikat selektiver oder verlagern Sie die Filterung in der Abfrage nach vorne, sodass weniger Zeilen im Baum nach oben weitergereicht werden.

Das Prinzip lautet: Verrichten Sie so wenig Arbeit wie möglich und filtern Sie so früh und so günstig wie möglich.

Seq Scan on events
  Filter: (event_type = 'purchase')
  Rows Removed by Filter: 9500000

Die Diagnose-Checkliste

Gehen Sie diese Punkte im Vorstellungsgespräch durch, dann verlieren Sie nicht den roten Faden:

  • Messen Sie mit EXPLAIN (ANALYZE, BUFFERS).
  • Lokalisieren Sie den Knoten, der am meisten Zeit verbraucht.
  • Vergleichen Sie geschätzte und tatsächliche Zeilen und korrigieren Sie zuerst veraltete Statistiken.
  • Prüfen Sie die Sargability und entfernen Sie Funktionen aus gefilterten Spalten.
  • Indizieren Sie selektive Filter und Join-Schlüssel.
  • Beschränken Sie die Spalten und vermeiden Sie SELECT *.
  • Achten Sie auf Auslagerungen auf die Festplatte und das Abrufen überflüssiger Zeilen.
  • Überprüfen Sie das Ergebnis, indem Sie den Plan erneut ausführen.

Alles zusammenführen

Gehen Sie ein vollständiges Beispiel Schritt für Schritt durch. Der Plan zeigt einen Seq Scan auf einer orders-Tabelle mit 50 Millionen Zeilen, den Filter customer_id = 42 und Rows Removed by Filter nahe 50 Millionen. Die Schätzung stimmt ungefähr mit dem tatsächlichen Wert überein.

Diagnose: selektiver Filter, kein Index, die dominante Kostenstelle ist der Scan. Lösung: CREATE INDEX ON orders(customer_id). Führen Sie die Abfrage erneut aus: Der Plan wechselt zu einem Index Scan, und die Laufzeit sinkt von mehreren Sekunden auf unter eine Millisekunde.

Diese Maßnehmen-diagnostizieren-beheben-überprüfen-Schleife ist das Antwortschema für jede Frage zu einer langsamen Abfrage.

CREATE INDEX idx_orders_customer ON orders (customer_id);
EXPLAIN (ANALYZE, BUFFERS)
SELECT order_id, amount FROM orders WHERE customer_id = 42;

Kurztest

Eine Abfrage filtert mit WHERE YEAR(order_date) = 2026, und der Plan zeigt trotz eines vorhandenen B-Tree-Indexes auf order_date einen vollständigen Seq Scan. Was ist die beste erste Lösung?

Zusammenfassung

Sie verfügen jetzt über eine wiederholbare Methode für Fragen zu langsamen Abfragen:

  • Führen Sie immer eine Messung mit EXPLAIN (ANALYZE, BUFFERS) durch und konzentrieren Sie sich auf den dominanten Knoten.
  • Beheben Sie zuerst veraltete Statistiken, wenn Schätzungen und tatsächliche Werte voneinander abweichen.
  • Formulieren Sie Prädikate sargable, fügen Sie Indizes für selektive Filter und Join-Schlüssel hinzu und vermeiden Sie SELECT *.
  • Beheben Sie Spills auf die Festplatte und Over-Fetching und überprüfen Sie anschließend den neuen Plan.

Wenn Sie die Checkliste erläutern, eine konkrete Änderung vorschlagen und den Plan anschließend erneut ausführen, um die Verbesserung zu belegen, ist das eine Antwort auf Senior-Niveau.

Häufig gestellte Fragen

Ist die Lektion „Langsame Abfragen erkennen und beheben“ kostenlos?

Ja — der vollständige Text von „Langsame Abfragen erkennen und beheben“ ist hier im Web kostenlos zu lesen. Um sie interaktiv zu üben (integrierter Code-Editor und 24/7 KI-Tutor) und den Rest des SQL Interview Prep-Kurses freizuschalten, upgrade auf CoddyKit PRO. Der SQL Interview Prep-Kurs umfasst insgesamt 4 Lektionen.

Was lerne ich in „Langsame Abfragen erkennen und beheben“?

Eine Diagnose-Checkliste für die Interviewfrage „Diese Abfrage ist langsam – beheben Sie sie“. Du übst SQL Interview Prep mit praktischem Code, den du direkt im Browser ausführst, und ein 24/7 KI-Tutor beantwortet deine Fragen während du die Lektion bearbeitest.

Brauche ich Erfahrung, um SQL Interview Prep zu starten?

Keine Vorkenntnisse erforderlich. SQL Interview Prep auf CoddyKit ist für Anfänger bis fortgeschrittene Lernende strukturiert, sodass du hier starten oder von Anfang an beginnen und in deinem eigenen Tempo voranschreiten kannst. Dies ist Lektion 4 von 4.

Wie lange dauert die Lektion „Langsame Abfragen erkennen und beheben“?

Die meisten CoddyKit-Lektionen dauern etwa 5–10 Minuten. Jede ist kompakt und interaktiv, sodass du stetig Fortschritte machst und genau dort weitermachst, wo du aufgehört hast – im Web und in der App.

Kann ich in dieser SQL Interview Prep-Lektion Code schreiben und ausführen?

Ja. Jede SQL Interview Prep-Lektion enthält einen integrierten Code-Editor, sodass du echten Code direkt in deinem Browser schreibst und ausführst und sofort KI-Feedback erhältst — ohne lokale Einrichtung erforderlich.

Alle Lektionen in diesem Kurs

  1. Einen EXPLAIN-Plan lesen
  2. Seq Scan, Index Scan und Index-Only
  3. Join-Algorithmen: Nested Loop, Hash, Merge
  4. Langsame Abfragen erkennen und beheben
← Zurück zu SQL Interview Prep