Hash-join versus merge-join versus geneste lus
Herken de drie belangrijkste joinstrategieën, hun kostenprofielen en wanneer elke strategie de beste keuze van de planner is.
Hash-join versus merge-join versus geneste lus is een gratis SQL Academy-les op CoddyKit. Dit is les 3 van 4. Je kunt de volledige les hieronder gratis lezen en daarna in de browser praktisch oefenen met een ingebouwde code-editor en een AI-begeleider die 24/7 beschikbaar is. Deze les maakt deel uit van het leertraject SQL Academy. Je voortgang wordt gesynchroniseerd op het web en in de CoddyKit-app. De cursus SQL Academy bevat in totaal 4 lessen.
Drie koppelstrategieën
PostgreSQL heeft drie fysieke koppelalgoritmen:
- Nested Loop — scan voor elke buitenste rij de binnenste
- Hash Join — bouw een hash van de binnenste invoer en zoek daarin met de buitenste invoer
- Merge Join — beide kanten zijn gesorteerd en worden gelijktijdig samengevoegd
Nested Loop
De eenvoudigste strategie: buitenste × binnenste. Snel wanneer de binnenste invoer een goede index heeft EN de buitenste invoer klein is:
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)Wanneer Nested Loop wint
De buitenste kant heeft weinig rijen EN de binnenste kant heeft een index op de koppelingssleutel — Nested Loop is dan extreem snel. In het slechtste geval: O(buitenste × binnenste).
Hash Join
Bouw een hashtabel aan één kant, meestal de kleinste, en zoek daar vervolgens in met de andere kant. Uitstekend voor het koppelen van twee grote tabellen wanneer er geen bruikbare index op de koppelingssleutel bestaat:
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_bWanneer Hash Join wint
Twee middelgrote tot grote tabellen, geen goede index op de koppelingssleutel, of de planner heeft veel rijen nodig. Geheugenbeperking: de hashtabel moet in work_mem passen, anders wordt deze naar schijf weggeschreven.
Merge Join
Beide kanten zijn gesorteerd op de koppelingssleutel en worden samen doorlopen. Uitstekend wanneer beide kanten al gesorteerd zijn, bijvoorbeeld door een passende 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)Wanneer Merge Join wint
Twee grote, vooraf gesorteerde invoeren. Lineaire scan, weinig geheugen. De sorteerkosten zijn belangrijk — als beide kanten expliciet moeten worden gesorteerd, wint Hash Join meestal.
Tussen strategieën kiezen
De planner kiest op basis van:
- Geschatte aantallen rijen
- Beschikbare indexen
- Geheugen (
work_mem) - Kostenconstanten in postgresql.conf
Een strategie afdwingen (alleen voor diagnose)
Voor foutopsporing kun je strategieën uitschakelen:
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.Naar schijf wegschrijven
Als de hashtabel of sortering groter wordt dan work_mem, schrijft de operator tijdelijke bestanden naar schijf — veel trager. Verhoog work_mem of herschrijf de query.
Parallelle koppelingen
PostgreSQL kan Hash Join en Merge Join parallel uitvoeren, evenals sequentiële scans en indexscans — zichtbaar als Parallel Hash Join met Workers Planned in EXPLAIN.
De keuze lezen
In EXPLAIN ANALYZE vertelt de naam van het koppelknooppunt je welke strategie wordt gebruikt. De keuze is bijna altijd juist — richt je bij problemen eerst op statistieken en indexen voordat je strategieën afdwingt.
Samenvatting
Drie koppelstrategieën zijn geschikt voor verschillende vormen.
- Nested Loop: kleine buitenste invoer + geïndexeerde binnenste invoer
- Hash: grote tabellen, geen bruikbare index
- Merge: vooraf gesorteerde invoeren
Korte controle
Je koppelt twee tabellen van 10 miljoen rijen op een kolom zonder index. Welk koppelalgoritme zal de planner waarschijnlijk kiezen?
Leer SQL met een AI-tutor — gratis
Schrijf echte code en voer die uit in je browser, krijg direct hulp van een AI-tutor die 24/7 beschikbaar is en ga verder waar je gebleven bent op het web of in de app.
- Cursussen
- 46
- Lessen
- 183
Veelgestelde vragen
Is de les “Hash-join versus merge-join versus geneste lus” gratis?
Ja — de volledige tekst van “Hash-join versus merge-join versus geneste lus” kun je hier gratis op het web lezen. Als je interactief wilt oefenen met een ingebouwde code-editor en een AI-begeleider die 24/7 beschikbaar is, en de rest van de cursus SQL Academy wilt ontgrendelen, kun je upgraden naar CoddyKit PRO. De cursus SQL Academy bevat in totaal 4 lessen.
Wat leer ik in “Hash-join versus merge-join versus geneste lus”?
Herken de drie belangrijkste joinstrategieën, hun kostenprofielen en wanneer elke strategie de beste keuze van de planner is. Je oefent met SQL Academy door code rechtstreeks in de browser uit te voeren. Een AI-begeleider die 24/7 beschikbaar is beantwoordt je vragen terwijl je de les doorwerkt.
Heb ik ervaring nodig om met SQL Academy te beginnen?
Ervaring vooraf is niet nodig. SQL Academy op CoddyKit is opgebouwd voor beginners tot gevorderden, zodat je hier of bij het begin kunt starten en in je eigen tempo kunt leren. Dit is les 3 van 4.
Hoe lang duurt de les “Hash-join versus merge-join versus geneste lus”?
De meeste lessen van CoddyKit duren ongeveer 5–10 minuten. Elke les is kort en interactief, zodat je gestaag vooruitgaat en op het web en in de app precies verdergaat waar je was gebleven.
Kan ik code schrijven en uitvoeren in deze les over SQL Academy?
Ja. Elke les over SQL Academy bevat een ingebouwde code-editor, zodat je rechtstreeks in je browser echte code kunt schrijven en uitvoeren en direct feedback van AI krijgt — lokale installatie is niet nodig.
Alle lessen in deze cursus
- EXPLAIN en EXPLAIN ANALYZE lezen
- Sequentiële scans versus indexscans
- Hash-join versus merge-join versus geneste lus
- Trage query's herkennen en oplossen