Innehållsförteckning
Vad är Nested Loop Join i Oracle
-För varje rad i den första radens källa får du tillgång till alla rader från den andra radens källa.
-NESTED LOOPS Join är en kopplingsoperation som väljer en rad från den valda början av radkällan och använder värdena för denna radkälla att köra in i eller välja från den sammanfogade radkällan och söka efter den matchande raden.
-Bäst för transaktioner av OLTP-typ
-det blir snabbast om rader som returneras från den första tabellen är små
-Nested Loop Join i Oracle 11g fungerar annorlunda. Mer information om det ges i den här artikeln
hur kapslad loop-join fungerar i Oracle
-Orakeloptimeraren bestämmer först körtabellen och betecknar den som den yttre slingan. Detta är källan för drivraden. Den producerar en uppsättning rader för att driva sammanfogningsvillkoret. Radkällan kan vara en tabell som nås med hjälp av indexskanning eller heltabellssökning. Raderna kan också produceras från vilken annan operation som helst. Till exempel kan utdata från en Nested Loop Join användas som en radkälla.
-Optimeraren betecknar en annan tabell som inre Loop. Detta itereras för varje rad som returneras från den yttre loopen. Detta är en åtkomstoperation på en tabell och bör helst vara en indexskanning.
-Operation som utförs av INNER-tabellen upprepas för varje rad som returneras i OUTTER-tabellen
for x in (select from outer table) loop for row in (select from inner table ) loop joined output rows is returned where condition is matched end loop end loop
Nested Loop Join Exempel
select /* +use_nl( a b) */ a.emp_no,b.dept_no,b.dept_name from emp a,dept b where a.dept_no=b.dept_no; SELECT STATEMENT NESTED LOOP TABLE ACCESS FULL DEPT TABLE ACCESS BY INDEX ROWID EMP INDEX RANGE SCAN EMP_N1
Hur den bearbetas
(1) Läs den första raden i DEPT
(2) Gör indexskanningen på EMP_N1 för att matcha dept_no och få den första raden
(3) Leta efter den refererade raden i EMP och slå samman informationen och ge output
(4) Upprepa operation 2,3 för varje rad som returneras
(5) Upprepa operation 1,2,3,4 för alla rader i DEPT
för x in (välj från tabell avd)
loop
för rad in (välj från tabell emp )
loop
förenade utdatarader returneras där villkoret matchas
end loop
slutslinga
Här skulle åtkomstmetoden för att välja från tabell-emp vara genom indexskanning
Om optimeraren väljer att använda någon annan join-metod kan du använda USE_NL(A B)-tipset, där A och B är tabellernas alias förenas.
Kostnadsberäkningar
I en NESTED LOOPS-koppling, för varje rad i den yttre raduppsättningen, kommer den inre raduppsättningen åt för att hitta alla matchande rader som ska sammanfogas. Därför, i denna typ av sammanfogning, nås den inre raduppsättningen lika många gånger som antalet rader i den yttre raduppsättningen.
Kostnad :kostnad för åtkomst till tabell A + antal rader som returneras från tabell A X kostnad för åtkomst till tabell B
Så detta kommer att vara kostnadseffektivt om små rader returneras från den yttre tabellen och åtkomstoperationen för den inre tabellen sker genom unik skanning eller skanning av litet indexområde
Ny metod för Nested Loop Join i Oracle 11g
SELECT STATEMENT NESTED LOOPS NESTED LOOPS TABLE ACCESS FULL DEPT INDEX UNIQUE SCAN EMP_IDX TABLE ACCESS BY INDEX ROWID EMP
Oracle-dokumentationen säger detta om
När ett index eller ett tabellblock inte finns i buffertcachen och behövs för att bearbeta joinen, krävs en fysisk I/O. I Oracle Database 11g Release 1 (11.1) kan Oracle Database batcha flera fysiska I/O-förfrågningar och bearbeta dem med en vektor I/O istället för att bearbeta dem en i taget. Som en del av den nya implementeringen för kapslade loop-kopplingar kan två NESTED LOOPS-kopplingsradkällor visas i exekveringsplanen där endast en skulle ha förekommit i tidigare versioner. I sådana fall tilldelar Oracle Database en källa för NESTED LOOPS-kopplingsrader för att sammanfoga värdena från tabellen på utsidan av kopplingen med indexet på insidan. En andra radkälla tilldelas för att sammanfoga resultatet av den första sammanfogningen, vilket inkluderar raderna lagrade i orakelindexet, med tabellen på insidan av sammanfogningen”
Nested Loops yttre koppling i Oracle
-Liknande med kapslad loop
-Rader som returneras även om den inre loopen inte har några rader som uppfyller kriterierna
-Till skillnad från den kapslade loopen som kan drivas från någon av tabellerna, är detta ett sätt att ansluta
a =b(+) kommer alltid att gå till a före b, detta kan resultera i en dyrare plan (möjligen icke-NL)
(+) går alltid på den bristfälliga sidan
Läser också
Hash Join
Join-metod i Oracle
https://en.wikipedia.org/wiki/Nested_loop_join