sql >> Database >  >> RDS >> Oracle

Geneste Loop Join in Oracle 11g

Inhoudsopgave

Wat is  Nested Loop Join in Oracle

-Voor elke rij in de eerste rijbron hebt u toegang tot alle rijen van de tweede rijbron.
-De NESTED LOOPS Join is een join-bewerking die een rij selecteert uit de geselecteerde beginrijbron en de waarden van deze rijbron gebruikt om de gekoppelde rijbron binnen te rijden of te selecteren op zoek naar de overeenkomende rij.
-Het beste voor transacties van het OLTP-type
-het is het snelst als de rijen die worden geretourneerd uit de eerste tabel klein zijn

-Nested Loop Join in Oracle 11g werkt anders. Details hierover vindt u in dit artikel

hoe geneste lus-join werkt in orakel

-De orakel-optimizer bepaalt eerst de rijtabel en wijst deze aan als de buitenste lus. Dit is de rij-bron. Het produceert een reeks rijen voor het aansturen van de join-voorwaarde. De rijbron kan een tabel zijn die toegankelijk is via indexscan of volledige tabelscan. De rijen kunnen ook vanuit elke andere bewerking worden geproduceerd. De uitvoer van een geneste lusverbinding kan bijvoorbeeld worden gebruikt als een rijbron.
-De optimizer wijst een andere tabel aan als binnenlus. Dit wordt herhaald voor elke rij die wordt geretourneerd vanuit de buitenste lus. Dit is een toegangsbewerking op een tabel en zou idealiter een indexscan moeten zijn.
-De bewerking die wordt uitgevoerd door de INNER-tabel wordt herhaald voor elke rij die wordt geretourneerd in de OUTER-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

Nested Loop Join Voorbeeld

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

Hoe het wordt verwerkt

(1) Lees de eerste rij in DEPT
(2) Voer de indexscan uit op EMP_N1 om dept_no te matchen en verkrijg de eerste rowid
(3) Zoek naar de rij waarnaar wordt verwezen in EMP en voeg de informatie samen en verstrek output
(4) Herhaal handeling 2,3 voor elke geretourneerde rowid
(5) Herhaal handeling 1,2,3,4 voor alle rijen in DEPT

for x in (selecteer uit table dept)
loop
for row in (selecteer uit table emp )
loop
samengevoegde outputrijen worden geretourneerd waar de voorwaarde overeenkomt
end lus
einde lus

Hier zou de toegangsmethode voor het selecteren uit de tabel emp zijn via indexscan
Als de optimizer ervoor kiest om een ​​andere join-methode te gebruiken, kunt u de USE_NL(A B)-hint gebruiken, waarbij A en B de aliassen van de tabellen zijn lid worden.

Kostenberekeningen
In een NESTED LOOPS-join wordt voor elke rij in de buitenste rij-set de binnenste rij-set geopend om alle overeenkomende rijen te vinden om mee te doen. Daarom wordt bij dit type samenvoeging de binnenste rijenset net zo vaak gebruikt als het aantal rijen in de buitenste rijenset.
Kosten :kosten voor toegang tot tafel A + aantal rijen geretourneerd van tafel A X kosten voor toegang tot tafel B

Dit is dus kosteneffectief als kleine rijen worden geretourneerd uit de buitenste tabel en de toegangsbewerking voor de binnenste tabel is via een unieke scan of een scan met een klein indexbereik

Nieuwe methode voor Nested Loop Join in Oracle 11g

SELECT STATEMENT
NESTED LOOPS
NESTED LOOPS
TABLE ACCESS FULL DEPT
INDEX UNIQUE SCAN EMP_IDX
TABLE ACCESS BY INDEX ROWID EMP

Oracle-documentatie zegt dit over
Als een index of een tabelblok zich niet in de buffercache bevindt en nodig is om de join te verwerken, is een fysieke I/O vereist. In Oracle Database 11g Release 1 (11.1) kan Oracle Database meerdere fysieke I/O-verzoeken batchgewijs verwerken en verwerken met behulp van een vector-I/O in plaats van ze één voor één te verwerken. Als onderdeel van de nieuwe implementatie voor geneste lus-joins, kunnen er twee NESTED LOOPS-joinrijbronnen verschijnen in het uitvoeringsplan waar er maar één zou zijn verschenen in eerdere releases. In dergelijke gevallen wijst Oracle Database één NESTED LOOPS-joinrijbron toe om de waarden uit de tabel aan de buitenkant van de join samen te voegen met de index aan de binnenkant. Een tweede rijbron wordt toegewezen om het resultaat van de eerste join te joinen, inclusief de rowids die zijn opgeslagen in de orakelindex, met de tabel aan de binnenkant van de join”

Nested Loops outer join in Oracle

-Vergelijkbaar met geneste lus
-Rijen geretourneerd, zelfs als de binnenste lus geen rijen heeft die aan de criteria voldoen
-In tegenstelling tot de geneste lus die vanuit een van de tabellen kan worden aangestuurd, is dit een eenrichtingsverbinding
a =b(+) gaat altijd naar a voor b, dit kan resulteren in duurder abonnement (mogelijk niet-NL)
(+) gaat altijd aan gebrekkige kant

Lees ook
Hash Join
Join-methode in Oracle
https://en.wikipedia.org/wiki/Nested_loop_join


  1. Dagen aan een datum toevoegen in T-SQL

  2. Hoe een varchar automatisch te verhogen

  3. Waar verander je de waarde van lower_case_table_names=2 op windows xampp

  4. MySQL/PHP-fout:[2002] Slechts één gebruik van elk socketadres (protocol/netwerkadres/poort) is normaal gesproken toegestaan