Hash-join kontra merge-join kontra nestede løkker
Gjenkjenn de tre viktigste join-strategiene, kostnadsprofilene deres og når hver av dem er planleggerens beste valg.
Hash-join kontra merge-join kontra nestede løkker er en gratis leksjon i SQL Academy på CoddyKit. Dette er leksjon 3 av 4. Du kan lese hele leksjonen gratis nedenfor – og deretter øve praktisk i nettleseren med en innebygd kodeeditor og en AI-veileder som er tilgjengelig døgnet rundt. Den er en del av læringsløpet i SQL Academy, og fremdriften din synkroniseres mellom nettet og CoddyKit-appen. Kurset i SQL Academy inneholder totalt 4 leksjoner.
Tre strategier for sammenkobling
PostgreSQL har tre fysiske algoritmer for sammenkobling:
- Nested Loop — skann den indre siden for hver rad på den ytre siden
- Hash Join — bygg en hash-tabell av den indre siden, og slå opp med den ytre
- Merge Join — sorter begge sider og flett dem sammen trinnvis
Nested Loop
Den enkleste strategien: ytre × indre. Rask når den indre siden har en god indeks OG den ytre siden er liten:
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 vinner
Den ytre siden har få rader OG den indre siden har en indeks på sammenkoblingsnøkkelen – Nested Loop er da svært rask. Verste tilfelle: O(ytre × indre).
Hash Join
Bygg en hash-tabell på den ene siden, vanligvis den minste, og slå deretter opp med den andre. Utmerket for å koble sammen to store tabeller når det ikke finnes en nyttig indeks på sammenkoblingsnøkkelen:
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 vinner
To middels store eller store tabeller, ingen god indeks på sammenkoblingsnøkkelen, eller planleggeren trenger mange rader. Begrensning i minnet: Hash-tabellen må få plass i work_mem, ellers skrives den til disk.
Merge Join
Begge sider er sortert etter sammenkoblingsnøkkelen og gjennomgås sammen. Utmerket når begge sider allerede er sortert, for eksempel av en samsvarende 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 vinner
To store, forhåndssorterte inndata. Lineær gjennomgang og lavt minneforbruk. Kostnaden ved sortering har betydning – hvis begge sider må sorteres eksplisitt, vinner hash vanligvis.
Velge mellom strategiene
Planleggeren velger basert på:
- Estimerte radantall
- Tilgjengelige indekser
- Minne (
work_mem) - Kostnadskonstanter i postgresql.conf
Tvinge frem en strategi (kun diagnostikk)
Ved feilsøking kan De 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.Skrive til disk
Hvis hash-tabellen eller sorteringen overskrider work_mem, skriver operatoren midlertidige filer til disk – noe som er mye tregere. De kan enten øke work_mem eller skrive om spørringen.
Parallelle sammenkoblinger
PostgreSQL kan parallellisere Hash Join og Merge Join, samt sekvensielle søk og indekssøk – dette vises som Parallel Hash Join med Workers Planned i EXPLAIN.
Tolke valget
I EXPLAIN ANALYZE forteller navnet på sammenkoblingsnoden hvilken strategi som brukes. Valget er nesten alltid riktig – når det ikke er det, bør De undersøke statistikk og indekser før De tvinger frem strategier.
Oppsummering
De tre strategiene for sammenkobling passer til ulike datamønstre.
- Nested Loop: liten ytre side + indeksert indre side
- Hash: store tabeller uten nyttig indeks
- Merge: forhåndssorterte inndata
Hurtigsjekk
De kobler sammen to tabeller med 10 millioner rader via en kolonne uten indeks. Hvilken sammenkoblingsalgoritme vil planleggeren sannsynligvis velge?
Lær deg SQL med en AI-veileder – gratis
Skriv og kjør ekte kode i nettleseren, få umiddelbar hjelp fra en AI-veileder som er tilgjengelig døgnet rundt, og fortsett der du slapp – på nettet eller i appen.
- Kurs
- 46
- Leksjoner
- 183
Ofte stilte spørsmål
Er leksjonen «Hash-join kontra merge-join kontra nestede løkker» gratis?
Ja – hele teksten i «Hash-join kontra merge-join kontra nestede løkker» er gratis å lese her på nettet. For å øve interaktivt med en innebygd kodeeditor og en AI-veileder som er tilgjengelig døgnet rundt, og for å låse opp resten av SQL Academy-kurset, kan du oppgradere til CoddyKit PRO. Kurset i SQL Academy inneholder totalt 4 leksjoner.
Hva lærer jeg i «Hash-join kontra merge-join kontra nestede løkker»?
Gjenkjenn de tre viktigste join-strategiene, kostnadsprofilene deres og når hver av dem er planleggerens beste valg. Du øver på SQL Academy med praktisk kode som du kjører direkte i nettleseren, mens en AI-veileder som er tilgjengelig døgnet rundt, svarer på spørsmålene dine mens du jobber deg gjennom leksjonen.
Trenger jeg erfaring for å begynne med SQL Academy?
Ingen tidligere erfaring er nødvendig. SQL Academy på CoddyKit er lagt opp for både nybegynnere og viderekomne, så De kan begynne her eller helt fra start og lære i Deres eget tempo. Dette er leksjon 3 av 4.
Hvor lang tid tar leksjonen «Hash-join kontra merge-join kontra nestede løkker»?
De fleste CoddyKit-leksjoner tar omtrent 5–10 minutter. Hver leksjon er kort og interaktiv, slik at De gjør jevne fremskritt og kan fortsette akkurat der De slapp – både på nettet og i appen.
Kan jeg skrive og kjøre kode i denne SQL Academy-leksjonen?
Ja. Alle SQL Academy-leksjoner har en innebygd kodeeditor, slik at De kan skrive og kjøre ekte kode direkte i nettleseren og få umiddelbar tilbakemelding fra AI – uten lokal konfigurering.
Alle leksjonene i dette kurset
- Lese EXPLAIN og EXPLAIN ANALYZE
- Sekvensielle skanninger kontra indeksskanninger
- Hash-join kontra merge-join kontra nestede løkker
- Identifisere og rette trege spørringer