En "sort sammanfogning" utförs genom att sortera de två datamängderna som ska sammanfogas enligt sammanfogningsnycklarna och sedan slå samman dem. Sammanslagningen är mycket billig, men sorten kan vara oöverkomligt dyr, särskilt om sorten rinner ut på skivan. Kostnaden för sorteringen kan sänkas om en av datamängderna kan nås i sorterad ordning via ett index, även om det kan vara mycket dyrt att komma åt en hög andel block av en tabell via en indexskanning i jämförelse med en fullständig tabellskanning. .
En hash-join utförs genom att hasha en datamängd till minnet baserat på join-kolumner och läsa den andra och undersöka hashtabellen för matchningar. Hash-anslutningen är mycket låg kostnad när hashtabellen kan hållas helt i minnet, med den totala kostnaden som uppgår till mycket lite mer än kostnaden för att läsa datamängderna. Kostnaden stiger om hashtabellen måste spillas till disk i en engångssortering, och stiger avsevärt för en multipasssortering.
(I pre-10g var yttre kopplingar från ett stort till ett litet bord problematiska prestandamässigt, eftersom optimeraren inte kunde lösa behovet av att komma åt det mindre bordet först för en hash-koppling, men det större bordet först för en yttre koppling. Följaktligen var hash-anslutningar inte tillgängliga i den här situationen).
Kostnaden för en hash-join kan reduceras genom att partitionera båda tabellerna på join-nycklarna. Detta gör det möjligt för optimeraren att dra slutsatsen att rader från en partition i en tabell endast kommer att hitta en matchning i en viss partition i den andra tabellen, och för tabeller med n partitioner exekveras hash-kopplingen som n oberoende hash-kopplingar. Detta har följande effekter:
- Storleken på varje hashtabell reduceras, vilket minskar den maximala mängden minne som krävs och eventuellt tar åtgärden bort behovet av att kräva tillfälligt diskutrymme.
- För parallella frågeoperationer reduceras mängden meddelanden mellan processer avsevärt, vilket minskar CPU-användningen och förbättrar prestandan, eftersom varje hash-koppling kan utföras av ett par PQ-processer.
- För icke-parallella frågeoperationer reduceras minneskravet med en faktor n, och de första raderna projiceras från frågan tidigare.
Du bör notera att hash-joins endast kan användas för equi-joins, men merge-joins är mer flexibla.
I allmänhet, om du sammanfogar stora mängder data i en equi-join så är en hash-join ett bättre val.
Detta ämne är mycket väl täckt i dokumentationen.
http://download.oracle.com/docs/cd/B28359_01/server.111/b28274/optimops.htm#i51523
12.1 docs:https://docs.oracle.com/database/121/TGSQL/tgsql_join.htm