sql >> Database teknologi >  >> RDS >> Oracle

Nested Loop Join in Oracle 11g

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


  1. Sådan fremskyndes masseindsættelse til MS SQL Server ved hjælp af pyodbc

  2. Hvordan bruger man pg_stat_activity?

  3. Guide til designdatabase til afstemning og undersøgelse i MySQL

  4. ScyllaDB-trends – Sådan implementerer brugere The Real-Time Big Data-database