Hash-join vs. merge-join vs. nested loop
Genkend de tre vigtigste join-strategier, deres omkostningsprofiler, og hvornår hver af dem er planlæggerens bedste valg.
Hash-join vs. merge-join vs. nested loop er en gratis SQL Academy-lektion på CoddyKit. Dette er lektion 3 af 4. Du kan læse hele lektionen gratis nedenfor — og derefter øve dig praktisk i browseren med en indbygget kodeeditor og en AI-vejleder, der er tilgængelig døgnet rundt. Den er en del af læringsforløbet i SQL Academy, og dine fremskridt synkroniseres på tværs af nettet og CoddyKit-appen. SQL Academy-kurset indeholder 4 lektioner i alt.
Tre join-strategier
PostgreSQL har tre fysiske join-algoritmer:
- Nested Loop — scan den indre side for hver ydre række
- Hash Join — opbyg en hash af den indre side, og slå op med den ydre side
- Merge Join — sortér begge sider, og flet dem sammen trin for trin
Nested Loop
Den enkleste strategi: ydre × indre. Hurtig, når den indre side har et godt indeks OG den ydre side er lille:
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)Når Nested Loop vinder
Den ydre side har få rækker, OG den indre side har et indeks på join-nøglen — så er Nested Loop ekstremt hurtig. Værste tilfælde: O(ydre × indre).
Hash Join
Opbyg en hashtabel på den ene side (som regel den mindre), og slå derefter op med den anden. Det er velegnet til at join’e to store tabeller, når der ikke findes et nyttigt indeks på join-nøglen:
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_bNår Hash Join vinder
To mellemstore eller store tabeller, intet godt indeks på join-nøglen, eller planlæggeren har brug for mange rækker. Hukommelsesbegrænsning: hashtabellen skal kunne være i work_mem, ellers skrives den til disken.
Merge Join
Begge sider er sorteret efter join-nøglen og gennemgås sammen. Det er velegnet, når begge sider allerede er sorteret (for eksempel af et matchende indeks):
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)Når Merge Join vinder
To store, forhåndssorterede input. Lineær scanning og lavt hukommelsesforbrug. Sorteringsomkostningen betyder noget — hvis begge sider skal sorteres eksplicit, vinder hash normalt.
Sådan vælger du mellem dem
Planlæggeren vælger ud fra:
- Estimerede antal rækker
- Tilgængelige indekser
- Hukommelse (
work_mem) - Omkostningskonstanter i postgresql.conf
Tving en strategi (kun til fejlsøgning)
Til fejlsøgning kan du deaktivere strategier:
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.Skrivning til disk
Hvis hashtabellen eller sorteringen overskrider work_mem, skriver operatoren midlertidige filer til disken — det er meget langsommere. Hæv enten work_mem, eller omskriv forespørgslen.
Parallelle joins
PostgreSQL kan parallelisere Hash Join og Merge Join (samt sekventielle scanninger og indeksscanninger) — det vises som Parallel Hash Join med Workers Planned i EXPLAIN.
Læs valget
I EXPLAIN ANALYZE fortæller join-nodens navn dig, hvilken strategi der bruges. Valget er næsten altid rigtigt — når det ikke er, bør du undersøge statistikker og indekser, før du tvinger en strategi.
Opsummering
De tre join-strategier passer til forskellige situationer.
- Nested Loop: lille ydre side + indekseret indre side
- Hash: store tabeller uden et nyttigt indeks
- Merge: forhåndssorterede input
Hurtigt tjek
Du join’er to tabeller med 10 millioner rækker via en ikke-indekseret kolonne. Hvilken join-algoritme vil planlæggeren sandsynligvis vælge?
Lær SQL med en AI-underviser — gratis
Skriv og kør rigtig kode i din browser, få øjeblikkelig hjælp fra en AI-underviser døgnet rundt, og fortsæt, hvor du slap, på web eller i appen.
- Kurser
- 46
- Lektioner
- 183
Ofte stillede spørgsmål
Er lektionen “Hash-join vs. merge-join vs. nested loop” gratis?
Ja — hele teksten til “Hash-join vs. merge-join vs. nested loop” kan læses gratis her på nettet. Hvis du vil øve dig interaktivt med en indbygget kodeeditor og en AI-vejleder døgnet rundt og få adgang til resten af SQL Academy-kurset, skal du opgradere til CoddyKit PRO. SQL Academy-kurset indeholder 4 lektioner i alt.
Hvad lærer jeg i “Hash-join vs. merge-join vs. nested loop”?
Genkend de tre vigtigste join-strategier, deres omkostningsprofiler, og hvornår hver af dem er planlæggerens bedste valg. Du øver dig i SQL Academy med praktisk kode, som du kører direkte i browseren, og en AI-vejleder døgnet rundt besvarer dine spørgsmål, mens du arbejder dig gennem lektionen.
Skal jeg have erfaring for at begynde på SQL Academy?
Der kræves ingen tidligere erfaring. SQL Academy på CoddyKit er tilrettelagt for både begyndere og øvede, så du kan starte her eller fra begyndelsen og lære i dit eget tempo. Dette er lektion 3 af 4.
Hvor lang tid tager lektionen “Hash-join vs. merge-join vs. nested loop”?
De fleste CoddyKit-lektioner tager cirka 5–10 minutter. Hver lektion er kort og interaktiv, så du gør løbende fremskridt og kan fortsætte, hvor du slap – på både web og app.
Kan jeg skrive og køre kode i denne SQL Academy-lektion?
Ja. Alle SQL Academy-lektioner har en indbygget kodeeditor, så du kan skrive og køre rigtig kode direkte i din browser og få øjeblikkelig feedback fra AI – uden lokal opsætning.
Alle lektioner i dette kursus
- Læsning af EXPLAIN og EXPLAIN ANALYZE
- Sekventielle scanninger vs. indeksscanninger
- Hash-join vs. merge-join vs. nested loop
- Identificering og løsning af langsomme forespørgsler