Joinalgoritmen begrijpen
Verken hoe PostgreSQL verschillende jointypen uitvoert: Nested Loop, Hash Join en Merge Join.
Joinalgoritmen begrijpen is een gratis Prestaties en queryoptimalisatie in PostgreSQL-les op CoddyKit. Dit is les 1 van 4. Je kunt 3 lessen uit dit leerpad gratis volledig lezen — daarna ontgrendelt CoddyKit PRO alle lessen, plus praktische oefeningen met een ingebouwde code-editor en een AI-tutor die 24/7 beschikbaar is. Deze les maakt deel uit van het leertraject Prestaties en queryoptimalisatie in PostgreSQL. Je voortgang wordt gesynchroniseerd op het web en in de CoddyKit-app. De cursus Prestaties en queryoptimalisatie in PostgreSQL bevat in totaal 4 lessen.
Joins: gegevens koppelen
Welkom bij de algoritmen voor joins in PostgreSQL! Joins zijn essentieel om gegevens uit meerdere tabellen te combineren.
Ze stellen je in staat om gerelateerde informatie op te halen die verspreid is over je databaseschema, zodat een compleet beeld ontstaat.
Verder dan eenvoudige joins
Wanneer je een JOIN-clause schrijft, kiest PostgreSQL niet zomaar één manier om die uit te voeren. Het beschikt over verschillende krachtige algoritmen.
De queryplanner van de database kiest het efficiëntste algoritme op basis van factoren zoals tabelgrootte, beschikbare indexen en gegevensverdeling.
Basisprincipes van een nested-loop join
De Nested Loop Join (NLJ) is het eenvoudigste algoritme. Het werkt als een geneste ‘for’-lus:
- Voor elke rij in de buitenste tabel...
- wordt de binnenste tabel doorzocht op overeenkomende rijen.
NLJ is efficiënt voor kleine gegevenssets of wanneer de join-kolom van de binnenste tabel is geïndexeerd, zodat waarden snel kunnen worden opgezocht.
NLJ in actie
Denk aan een join tussen een kleine tabel users en een tabel user_details. Als user_details.user_id is geïndexeerd, kan NLJ zeer snel zijn.
Probeer deze tabellen te maken en te koppelen:
CREATE TABLE users (user_id INT PRIMARY KEY, name VARCHAR(50));
CREATE TABLE user_details (detail_id INT PRIMARY KEY, user_id INT, address VARCHAR(100));
INSERT INTO users VALUES (1, 'Alice'), (2, 'Bob');
INSERT INTO user_details VALUES (101, 1, '123 Main St'), (102, 2, '456 Oak Ave');
SELECT u.name, ud.address
FROM users u
JOIN user_details ud ON u.user_id = ud.user_id;Hash join: sneller overeenkomsten vinden
Hash join wordt vaak gekozen voor grotere, ongesorteerde tabellen, vooral bij joinvoorwaarden met gelijkheid (=). Het werkt in twee fasen:
- Opbouwfase: PostgreSQL scant de kleinere (of naar schatting kleinere) tabel en bouwt met de joinsleutel een hashtabel in het geheugen.
- Zoekfase: Het scant de grotere tabel, hasht de joinsleutel van elke rij en zoekt naar overeenkomsten in de hashtabel.
Deze methode is zeer effectief wanneer er genoeg geheugen beschikbaar is voor de hashtabel.
Scenario voor een hash join
Stel dat je twee grote tabellen, products en sales, koppelt op hun product_id. Als geen van beide tabellen op product_id is gesorteerd of geïndexeerd, is een hash join een sterke kandidaat.
De planner zal voor deze query waarschijnlijk een hash join kiezen:
CREATE TABLE products (product_id INT PRIMARY KEY, name VARCHAR(50));
CREATE TABLE sales (sale_id INT PRIMARY KEY, product_id INT, quantity INT);
INSERT INTO products VALUES (1, 'Laptop'), (2, 'Mouse');
INSERT INTO sales VALUES (1001, 1, 2), (1002, 2, 1), (1003, 1, 3);
SELECT p.name, s.quantity
FROM products p
JOIN sales s ON p.product_id = s.product_id;Merge join: efficiëntie door sortering
De merge join is zeer efficiënt wanneer beide tabellen al op hun joinsleutels zijn gesorteerd of goedkoop kunnen worden gesorteerd. Ook dit algoritme werkt in fasen:
- Sorteerfase: Als ze nog niet gesorteerd zijn, worden beide tabellen op hun join-kolommen gesorteerd.
- Samenvoegfase: PostgreSQL scant beide gesorteerde tabellen tegelijkertijd en voegt overeenkomende rijen samen. Het lijkt op het samenvoegen van twee gesorteerde lijsten.
Dit is nuttig voor range-joins of wanneer gegevens in gesorteerde volgorde worden opgehaald.
Toepassing van een merge join
Als je de tabellen employees en departments koppelt en beide op hun respectieve ID-kolommen zijn geïndexeerd (en daardoor vaak gesorteerd zijn), of als je query een ORDER BY op de joinsleutel bevat, kan een merge join optimaal zijn.
PostgreSQL gebruikt hier mogelijk een merge join:
CREATE TABLE employees (emp_id INT PRIMARY KEY, dept_id INT, name VARCHAR(50));
CREATE TABLE departments (dept_id INT PRIMARY KEY, dept_name VARCHAR(50));
INSERT INTO employees VALUES (1, 10, 'John'), (2, 20, 'Jane');
INSERT INTO departments VALUES (10, 'HR'), (20, 'IT');
SELECT e.name, d.dept_name
FROM employees e
JOIN departments d ON e.dept_id = d.dept_id
ORDER BY e.emp_id;De keuzes van PostgreSQL
De queryplanner van PostgreSQL gebruikt een op kosten gebaseerde optimalisatie om te bepalen welk joinalgoritme wordt gebruikt. De planner schat de kosten van elk mogelijk plan op basis van:
- statistieken over tabellen en indexen
- beschikbaar geheugen (
work_mem) - het type joinvoorwaarde (bijvoorbeeld gelijkheid of bereik)
- het geschatte aantal rijen
Het gebruik van EXPLAIN is essentieel om te zien welk algoritme de planner heeft gekozen!
Algoritme-uitdaging
Je moet twee zeer grote tabellen, customers en orders, koppelen op customer_id. In geen van beide tabellen staan indexen op customer_id en de gegevens zijn ongesorteerd. Welk joinalgoritme zal PostgreSQL waarschijnlijk kiezen voor optimale prestaties?
Joinalgoritmen: belangrijkste punten
In deze les heb je de drie belangrijkste joinalgoritmen van PostgreSQL verkend:
- Nested-loop join: eenvoudig en geschikt voor kleine sets of geïndexeerde binnenste tabellen.
- Hash join: efficiënt voor grote, ongesorteerde tabellen met joins op gelijkheid, waarbij een hashtabel wordt gebruikt.
- Merge join: het beste wanneer tabellen al op hun joinsleutels zijn gesorteerd of goedkoop kunnen worden gesorteerd.
Als je deze algoritmen begrijpt, kun je EXPLAIN-plannen beter interpreteren en beter presterende queries schrijven. Hierna bekijken we hoe je complexe joins kunt herschrijven!
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
- 22
- Lessen
- 88
Veelgestelde vragen
Is de les “Joinalgoritmen begrijpen” gratis?
Ja — je kunt hier op het web alle 3 lessen van het leerpad Prestaties en queryoptimalisatie in PostgreSQL, waaronder “Joinalgoritmen begrijpen”, gratis volledig lezen. Daarna ontgrendelt CoddyKit PRO alle lessen, plus interactieve oefeningen met een ingebouwde code-editor en een AI-tutor die 24/7 beschikbaar is. De cursus Prestaties en queryoptimalisatie in PostgreSQL bevat in totaal 4 lessen.
Wat leer ik in “Joinalgoritmen begrijpen”?
Verken hoe PostgreSQL verschillende jointypen uitvoert: Nested Loop, Hash Join en Merge Join. Je oefent met Prestaties en queryoptimalisatie in PostgreSQL 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 Prestaties en queryoptimalisatie in PostgreSQL te beginnen?
Ervaring vooraf is niet nodig. Prestaties en queryoptimalisatie in PostgreSQL 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 1 van 4.
Hoe lang duurt de les “Joinalgoritmen begrijpen”?
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 Prestaties en queryoptimalisatie in PostgreSQL?
Ja. Elke les over Prestaties en queryoptimalisatie in PostgreSQL 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
- Joinalgoritmen begrijpen
- Complexe joins herschrijven
- Subquery's versus CTE's versus joins
- LATERAL-joins en gecorreleerde opzoekingen optimaliseren