Oracle
 sql >> Datenbank >  >> RDS >> Oracle

Nested-Loop-Join in Oracle 11g

Inhaltsverzeichnis

Was ist  Nested Loop Join in Oracle

- Greifen Sie für jede Zeile in der ersten Zeilenquelle auf alle Zeilen aus der zweiten Zeilenquelle zu.
- Der NESTED LOOPS Join ist eine Join-Operation, die eine Zeile aus der ausgewählten Anfangszeilenquelle auswählt und die Werte dieser Zeilenquelle verwendet um in die verbundene Zeilenquelle zu gelangen oder daraus auszuwählen, indem nach der passenden Zeile gesucht wird.
-Am besten für Transaktionen vom OLTP-Typ
-Am schnellsten, wenn die Zeilen, die von der ersten Tabelle zurückgegeben werden, klein sind

-Nested Loop Join in Oracle 11g funktioniert anders. Details dazu finden Sie in diesem Artikel

Wie Nested Loop Join in Oracle funktioniert

- Der Oracle-Optimierer bestimmt zuerst die Fahrtabelle und bezeichnet sie als äußere Schleife. Dies ist die Quelle der Fahrzeile. Es erzeugt eine Reihe von Zeilen zum Steuern der Join-Bedingung. Die Zeilenquelle kann eine Tabelle sein, auf die über einen Indexscan oder einen vollständigen Tabellenscan zugegriffen wird. Die Zeilen können auch aus jeder anderen Operation hergestellt werden. Beispielsweise kann die Ausgabe eines Nested-Loop-Joins als Zeilenquelle verwendet werden.
-Der Optimierer bestimmt eine andere Tabelle als innere Schleife. Dies wird für jede Zeile wiederholt, die von der äußeren Schleife zurückgegeben wird. Dies ist eine Zugriffsoperation auf eine Tabelle und sollte idealerweise ein Index-Scan sein.
-Die von der INNER-Tabelle ausgeführte Operation wird für jede Zeile wiederholt, die in der OUTER-Tabelle zurückgegeben wird

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

Beispiel für Nested Loop Join

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

Wie es verarbeitet wird

(1) Lesen Sie die erste Zeile in DEPT
(2) Führen Sie den Index-Scan auf EMP_N1 für übereinstimmende dept_no durch und erhalten Sie die erste Zeilen-ID
(3) Suchen Sie nach der referenzierten Zeile in EMP und verbinden Sie die Informationen und geben Sie sie an Ausgabe
(4) Wiederholen Sie Vorgang 2,3 für jede zurückgegebene Zeilen-ID
(5) Wiederholen Sie Vorgang 1,2,3,4 für alle Zeilen in DEPT

for x in (select from table dept)
loop
for row in (select from table emp )
loop
verknüpfte Ausgabezeilen werden zurückgegeben, wenn Bedingung erfüllt ist
end Schleife
Endschleife

Hier wäre die Zugriffsmethode für die Auswahl aus Tabelle emp der Index-Scan
Wenn der Optimierer eine andere Join-Methode verwendet, können Sie den USE_NL(A B)-Hinweis verwenden, wobei A und B die Aliase der Tabellen sind verbunden werden.

Kostenberechnungen
In einem NESTED LOOPS-Join wird für jede Zeile im äußeren Row-Set auf das innere Row-Set zugegriffen, um alle übereinstimmenden Zeilen zum Join zu finden. Daher wird bei dieser Art von Join so oft auf das innere Rowset zugegriffen wie die Anzahl der Zeilen im äußeren Rowset.
Kosten :Kosten für den Zugriff auf Tabelle A + Anzahl der von Tabelle A zurückgegebenen Zeilen X Kosten für den Zugriff auf Tabelle B

Dies ist also kostengünstig, wenn kleine Zeilen von der äußeren Tabelle zurückgegeben werden und der Zugriffsvorgang für die innere Tabelle über einen eindeutigen Scan oder einen kleinen Indexbereichsscan erfolgt

Neue Methode für 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-Dokumentationen sagen dies über
Wenn sich ein Index oder ein Tabellenblock nicht im Puffercache befindet und zur Verarbeitung des Joins benötigt wird, ist eine physische E/A erforderlich. In Oracle Database 11g Release 1 (11.1) kann Oracle Database mehrere physische E/A-Anforderungen stapeln und mithilfe einer Vektor-E/A verarbeiten, anstatt sie einzeln zu verarbeiten. Als Teil der neuen Implementierung für Nested-Loop-Joins werden möglicherweise zwei NESTED LOOPS-Join-Zeilenquellen im Ausführungsplan angezeigt, wo in früheren Versionen nur eine erschienen wäre. In solchen Fällen weist Oracle Database eine NESTED LOOPS-Join-Zeilenquelle zu, um die Werte aus der Tabelle auf der Außenseite des Joins mit dem Index auf der Innenseite zu verknüpfen. Eine zweite Zeilenquelle wird zugewiesen, um das Ergebnis des ersten Joins, das die im Oracle-Index gespeicherten Rowids enthält, mit der Tabelle auf der Innenseite des Joins zu verknüpfen.“

Äußere Verknüpfung von verschachtelten Schleifen in Oracle

-Ähnlich einer verschachtelten Schleife
-Zeilen werden zurückgegeben, auch wenn die innere Schleife keine Zeilen enthält, die die Kriterien erfüllen
-Im Gegensatz zur verschachtelten Schleife, die von einer der Tabellen gesteuert werden kann, ist dies ein Einweg-Join
a =b(+) geht immer zu a vor b, dies kann zu einem teureren Plan führen (möglicherweise nicht-NL)
(+) geht immer auf die mangelhafte Seite

Liest auch
Hash Join
Join-Methode in Oracle
https://en.wikipedia.org/wiki/Nested_loop_join