Sommario
Cos'è Nested Loop Join in Oracle
-Per ogni riga della sorgente della prima riga accedi a tutte le righe della sorgente della seconda riga.
-Il join NESTED LOOPS è un'operazione di join che seleziona una riga dalla sorgente della riga iniziale selezionata e utilizza i valori di questa sorgente della riga per accedere o selezionare dall'origine riga unita alla ricerca della riga corrispondente.
-ideale per transazioni di tipo OLTP
-sarà più veloce se le righe restituite dalla prima tabella sono piccole
-Nested Loop Join in Oracle 11g funziona in modo diverso. I dettagli sono forniti in questo articolo
come funziona il join del ciclo nidificato in Oracle
-L'ottimizzatore di Oracle determina prima la tabella di guida e la designa come ciclo esterno. Questa è l'origine della riga di guida. Produce un insieme di righe per guidare la condizione di unione. L'origine riga può essere una tabella a cui si accede utilizzando la scansione dell'indice o la scansione completa della tabella. Le file possono essere prodotte anche da qualsiasi altra operazione. Ad esempio, l'output di un Nested Loop Join può essere utilizzato come origine di riga.
-L'ottimizzatore designa un'altra tabella come ciclo interno. Viene ripetuto per ogni riga restituita dal ciclo esterno. Questa è un'operazione di accesso su una tabella e idealmente dovrebbe essere una scansione dell'indice.
-L'operazione eseguita dalla tabella INNER viene ripetuta per ogni riga restituita nella tabella OUTER
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
Esempio di partecipazione a loop nidificato
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
Come viene elaborato
(1) Leggi la prima riga in DEPT
(2) Esegui la scansione dell'indice su EMP_N1 per la corrispondenza dept_no e ottieni il primo ID riga
(3) Cerca la riga di riferimento in EMP e unisci le informazioni e fornisci output
(4) Ripetere l'operazione 2,3 per ogni ID riga restituito
(5) Ripetere l'operazione 1,2,3,4 per tutte le righe in DEPT
for x in (select from table dept)
loop
for row in (select from table emp )
loop
le righe di output unite vengono restituite dove la condizione è soddisfatta
end loop
end loop
Qui il metodo di accesso per selezionare dalla tabella emp sarebbe attraverso la scansione dell'indice
Se l'ottimizzatore sceglie di utilizzare qualche altro metodo di join, puoi usare l'hint USE_NL(AB), dove A e B sono gli alias delle tabelle essere unito.
Calcoli dei costi
In un join NESTED LOOPS, per ogni riga nel set di righe esterno, si accede al set di righe interno per trovare tutte le righe corrispondenti da unire. Pertanto, in questo tipo di join, si accede all'insieme di righe interne tante volte quante sono le righe nell'insieme di righe esterne.
Costo :costo per accedere alla tabella A + nr di righe restituite dalla tabella A X costo per accedere alla tabella B
Quindi questo sarà conveniente se vengono restituite piccole righe dalla tabella esterna e l'operazione di accesso per la tabella interna avviene tramite la scansione univoca o la scansione di un intervallo di indici ridotto
Nuovo metodo per il 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
La documentazione di Oracle dice questo su
Quando un indice o un blocco tabella non si trova nella cache del buffer ed è necessario per elaborare il join, è necessario un I/O fisico. In Oracle Database 11g Release 1 (11.1), Oracle Database può eseguire il batch di più richieste di I/O fisiche ed elaborarle utilizzando un I/O vettoriale invece di elaborarle una alla volta. Come parte della nuova implementazione per i join di loop nidificati, nel piano di esecuzione potrebbero essere visualizzate due origini di riga di join NESTED LOOPS in cui solo una sarebbe apparsa nelle versioni precedenti. In questi casi, Oracle Database alloca un'origine riga di join NESTED LOOPS per unire i valori della tabella sul lato esterno del join con l'indice sul lato interno. Viene allocata una seconda riga di origine per unire il risultato del primo join, che include i rowid archiviati nell'indice di Oracle, con la tabella sul lato interno del join"
Neded Loops outer join in Oracle
-Simile al ciclo nidificato
-Righe restituite anche se il ciclo interno non contiene righe che soddisfano i criteri
-A differenza del ciclo nidificato che potrebbe essere guidato da una delle tabelle, questo è un modo per unire
/>a =b(+) andrà sempre a a prima di b, ciò potrebbe comportare un piano più costoso (possibilmente non NL)
(+) va sempre dal lato carente
Legge anche
Hash Join
Metodo Join in Oracle
https://en.wikipedia.org/wiki/Nested_loop_join