Indholdsfortegnelse
Hvad er Nested Loop Join i Oracle
-For hver række i den første rækkes kilde får du adgang til alle rækkerne fra den anden rækkes kilde.
-NESTED LOOPS Join er en joinoperation, der vælger en række fra den valgte begyndelsesrækkekilde og bruger værdierne for denne rækkekilde at køre ind i eller vælge fra den sammenføjede rækkekilde ved at søge efter den matchende række.
-Bedst til OLTP-transaktioner
-det vil være hurtigst, hvis rækker returneret fra den første tabel er små
-Nested Loop Join i Oracle 11g fungerer anderledes. Detaljer om det er givet i denne artikel
hvordan indlejret loop-sammenføjning fungerer i Oracle
-Oracle optimizer bestemmer først køretabellen og udpeger den som den ydre sløjfe. Dette er kilden til kørerækken. Det producerer et sæt rækker til at køre sammenføjningstilstanden. Rækkekilden kan være en tabel, der tilgås ved hjælp af indeksscanning eller fuld tabelscanning. Rækkerne kan også fremstilles fra enhver anden operation. For eksempel kan output fra en Nested Loop Join bruges som en rækkekilde.
-Optimeringsværktøjet angiver en anden tabel som indre Loop. Dette itereres for hver række, der returneres fra den ydre loop. Dette er en adgangsoperation på en tabel og burde ideelt set være en indeksscanning.
-Operation udført af INNER tabel gentages for hver række, der returneres i YDRE tabel
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
Eksempel på indlejret løkkeforbindelse
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
Sådan behandles det
(1) Læs den første række i DEPT
(2) Foretag indeksscanningen på EMP_N1 for at matche dept_no og få den første række
(3) Se efter den refererede række i EMP og sammensæt oplysningerne og giv output
(4) Gentag operation 2,3 for hver returneret række
(5) Gentag operation 1,2,3,4 for alle rækkerne i DEPT
for x in (vælg fra tabelafdeling)
loop
for række i (vælg fra tabelemp)
loop
forenede outputrækker returneres, hvor betingelse matches
slut sløjfe
slut sløjfe
Her ville adgangsmetoden til at vælge fra tabel-emp være gennem indeksscanning
Hvis optimeringsværktøjet vælger at bruge en anden joinmetode, kan du bruge USE_NL(A B)-hintet, hvor A og B er tabellernes aliaser bliver tilsluttet.
Omkostningsberegninger
I en NESTED LOOPS-sammenføjning, for hver række i det ydre rækkesæt, er der adgang til det indre rækkesæt for at finde alle de matchende rækker, der skal sammenføjes. Derfor, i denne type join, tilgås det indre rækkesæt lige så mange gange som antallet af rækker i det ydre rækkesæt.
Pris :pris for adgang til tabel A + antal rækker returneret fra tabel A X omkostninger for adgang til tabel B
Så dette vil være omkostningseffektivt, hvis små rækker returneres fra den ydre tabel, og adgangen til den indre tabel er gennem unik scanning eller scanning af lille indeksområde
Ny metode til 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-dokumentation siger dette om
Når et indeks eller en tabelblok ikke er i buffercachen og er nødvendig for at behandle joinforbindelsen, er en fysisk I/O påkrævet. I Oracle Database 11g Release 1 (11.1) kan Oracle Database batch flere fysiske I/O-anmodninger og behandle dem ved hjælp af en vektor I/O i stedet for at behandle dem én ad gangen. Som en del af den nye implementering for indlejrede loop-sammenføjninger kan to NESTED LOOPS join-rækkekilder blive vist i udførelsesplanen, hvor kun én ville have optrådt i tidligere udgivelser. I sådanne tilfælde tildeler Oracle Database én NESTED LOOPS joinrækkekilde for at forbinde værdierne fra tabellen på den ydre side af joinforbindelsen med indekset på indersiden. En anden rækkekilde er allokeret til at forbinde resultatet af den første joinforbindelse, som inkluderer rækkerne gemt i orakelindekset med tabellen på indersiden af joinforbindelsen"
Indlejrede loops ydre joinforbindelse i Oracle
- Svarende til indlejret løkke
-Rækker returneret, selvom indre løkke ikke har nogen rækker, der opfylder kriterierne
-I modsætning til den indlejrede løkke, som kan være drevet fra en af tabellerne, er dette en måde at forbinde
a =b(+) vil altid gå til a før b, dette kan resultere i en dyrere plan (muligvis ikke-NL)
(+) går altid på den mangelfulde side
Læser også
Hash Join
Join-metode i Oracle
https://en.wikipedia.org/wiki/Nested_loop_join