sql >> Databasteknik >  >> RDS >> Oracle

Nested Loop Join in Oracle 11g

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


  1. Hur sammanfogar man många rader med samma id i sql?

  2. Exportera din databas för överföring

  3. Hur man importerar CSV-fil till MySQL-tabell

  4. SQL Server:Extrahera tabellmetadata (beskrivning, fält och deras datatyper)