0Pricing
SQL Academy · Lektion

Hash Join vs. Merge Join vs. Nested Loop

Lernen Sie die drei wichtigsten Join-Strategien, ihre Kostenprofile und wann jede davon die beste Wahl des Planers ist.

Hash Join vs. Merge Join vs. Nested Loop ist eine kostenlose SQL Academy-Lektion auf CoddyKit. Dies ist Lektion 3 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 Academy-Lernpfads, und dein Fortschritt wird über Web und CoddyKit-App synchronisiert. Der SQL Academy-Kurs umfasst insgesamt 4 Lektionen.

Drei Strategien für Joins

PostgreSQL verfügt über drei physische Join-Algorithmen:

  • Nested Loop – für jede äußere Zeile den inneren Teil durchsuchen
  • Hash Join – einen Hash des inneren Teils erstellen und mit dem äußeren Teil abfragen
  • Merge Join – beide Seiten sortieren und synchron zusammenführen

Nested Loop

Die einfachste Variante: outer × inner. Schnell, wenn der innere Teil einen guten Index hat UND der äußere Teil klein ist:

EXPLAIN ANALYZE
SELECT * FROM users u JOIN orders o ON o.user_id = u.id
WHERE u.id = 42;
-- Nested Loop
--   -> Index Scan on users where id = 42  (rows=1)
--   -> Index Scan on orders_user_id_idx    (rows=5)

Wann der Nested Loop gewinnt

Der äußere Teil enthält wenige Zeilen UND der innere Teil hat einen Index auf dem Join-Schlüssel – dann ist der Nested Loop äußerst schnell. Im schlechtesten Fall: O(outer × inner).

Hash Join

Erstellen Sie auf einer Seite eine Hash-Tabelle (üblicherweise auf der kleineren) und fragen Sie sie anschließend mit der anderen Seite ab. Ideal zum Verknüpfen zweier großer Tabellen, wenn für den Join-Schlüssel kein geeigneter Index existiert:

EXPLAIN ANALYZE
SELECT * FROM big_a a JOIN big_b b ON a.key = b.key;
-- Hash Join (cost=10000..50000)
--   -> Seq Scan on big_a
--   -> Hash
--       -> Seq Scan on big_b

Wann der Hash Join gewinnt

Zwei mittelgroße bis große Tabellen, kein geeigneter Index für den Join-Schlüssel oder der Planer benötigt viele Zeilen. Speicherbeschränkung: Die Hash-Tabelle muss in work_mem passen, sonst wird sie auf die Festplatte ausgelagert.

Merge Join

Beide Seiten sind nach dem Join-Schlüssel sortiert und werden gemeinsam durchlaufen. Ideal, wenn beide Seiten bereits sortiert sind (zum Beispiel durch einen passenden Index):

EXPLAIN ANALYZE
SELECT * FROM big_a a JOIN big_b b ON a.key = b.key
ORDER BY a.key;
-- Merge Join
--   -> Index Scan on big_a (a.key ASC)
--   -> Index Scan on big_b (b.key ASC)

Wann der Merge Join gewinnt

Zwei große, vorsortierte Eingaben. Linearer Scan, geringer Speicherbedarf. Die Sortierkosten sind entscheidend – wenn beide Seiten erst explizit sortiert werden müssen, gewinnt normalerweise der Hash Join.

Zwischen den Strategien wählen

Der Planer entscheidet anhand von:

  • Geschätzten Zeilenanzahlen
  • Verfügbaren Indizes
  • Speicher (work_mem)
  • Kostenkonstanten in postgresql.conf

Eine Strategie erzwingen (nur zur Diagnose)

Zur Fehlersuche können Sie Strategien deaktivieren:

SET enable_hashjoin = off;
SET enable_mergejoin = off;
SET enable_nestloop = off;
-- Re-run EXPLAIN to see what the planner picks instead.
-- NEVER persist these in production.

Auslagern auf die Festplatte

Wenn die Hash-Tabelle oder die Sortierung work_mem überschreitet, lagert der Operator temporäre Dateien auf die Festplatte aus – das ist deutlich langsamer. Erhöhen Sie entweder work_mem oder schreiben Sie die Abfrage um.

Parallele Joins

PostgreSQL kann Hash Join und Merge Join (sowie Sequential und Index Scans) parallelisieren – sichtbar als Parallel Hash Join mit Workers Planned in EXPLAIN.

Die Auswahl lesen

In EXPLAIN ANALYZE zeigt der Name des Join-Knotens die verwendete Strategie. Die Auswahl ist fast immer richtig – wenn nicht, konzentrieren Sie sich auf Statistiken und Indizes, bevor Sie Strategien erzwingen.

Zusammenfassung

Die drei Join-Strategien eignen sich für unterschiedliche Situationen.

  • Nested Loop: kleiner äußerer Teil + indizierter innerer Teil
  • Hash Join: große Tabellen, kein geeigneter Index
  • Merge Join: vorsortierte Eingaben

Kurztest

Sie verknüpfen zwei Tabellen mit jeweils 10 Millionen Zeilen über eine nicht indizierte Spalte. Welchen Join-Algorithmus wird der Planer wahrscheinlich auswählen?

Häufig gestellte Fragen

Ist die Lektion „Hash Join vs. Merge Join vs. Nested Loop“ kostenlos?

Ja — der vollständige Text von „Hash Join vs. Merge Join vs. Nested Loop“ 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 Academy-Kurses freizuschalten, upgrade auf CoddyKit PRO. Der SQL Academy-Kurs umfasst insgesamt 4 Lektionen.

Was lerne ich in „Hash Join vs. Merge Join vs. Nested Loop“?

Lernen Sie die drei wichtigsten Join-Strategien, ihre Kostenprofile und wann jede davon die beste Wahl des Planers ist. Du übst SQL Academy 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 Academy zu starten?

Keine Vorkenntnisse erforderlich. SQL Academy 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 3 von 4.

Wie lange dauert die Lektion „Hash Join vs. Merge Join vs. Nested Loop“?

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 Academy-Lektion Code schreiben und ausführen?

Ja. Jede SQL Academy-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. EXPLAIN und EXPLAIN ANALYZE lesen
  2. Sequenzielle Scans vs. Index-Scans
  3. Hash Join vs. Merge Join vs. Nested Loop
  4. Langsame Abfragen erkennen und beheben
← Zurück zu SQL Academy