Sven Schönhoff

Vor- und Nachteile von Oracle Join Methoden

Der kostenbasierte Oracle Optimizer ermittelt beim Zugriff auf zwei oder mehrere Tabellen in einem SELECT-Befehl, welche Tabelle zuerst gelesen und somit zur €žtreibenden Tabelle€œ wird und in welcher Reihenfolge die weiteren Tabellen hinzugenommen werden. Entscheidend dabei ist auch die Methode zur Zusammenführung der Teilmengen der Tabellen. Dem Oracle Optimizer stehen zur Umsetzung von Join-Operationen drei unterschiedliche Strategien zu Verfügung, welche im Folgenden dargestellt werden.

Nested Loops Join
Einen Nested Loops Join kann man sich wie eine geschachtelte FOR()- oder WHILE()-Schleife in der konventionellen Programmierung vorstellen. Die Rückgabewerte der treibenden Tabelle werden abgearbeitet und für jeden Rückgabewert wird die andere Tabelle bzw. deren Index einmal durchlaufen.

Vorteile:

Nachteile:

Sort-Merge Join

Die Tabellen werden zuerst nach den Schlüsselspalten der Join-Spalten sortiert, das Ergebnis kann dann mit einem einmaligen Scan durch beide sortierten Relationen berechnet werden.

Vorteile:

Nachteile:

Hash Join
Aus dem Resultset der kleineren Tabelle wird zunächst eine Hashtabelle im Hauptspeicher erstellt. Dazu werden über eine Hashfunktion Hashwerte aus den Attributen der Join-Spalten gebildet. Der Hashwert wird dann an einer durch seinen Wert festgelegten Stelle (Bucket) in der Hashtabelle abgelegt.
Die größere Tabelle dient nun als treibende Tabelle. Satz für Satz werden ihre relevanten Attribute ebenfalls über die Hashfunktion berechnet. Dadurch kann der passende Bucket der Hashtabelle bestimmt werden, in welchem geprüft wird, ob ein entsprechender Wert der kleineren Tabelle vorhanden ist. Ãœber den passenden Hashwert ist dann die Bestimmung des gesuchten Datensatzes möglich.

Vorteile:

Nachteile:

Join Operation Hints
Wenn man dem Oracle Optimizer bei der Wahl der richtigen Strategie für die Join-Operation nicht traut und selber die beste Strategie erzwingen oder durch Tests ermitteln möchte, kann man die Wahl über Hints manipulieren.
Die Definition von Hints geschieht folgendermaßen: SELECT /*+ Hint */ €¦ FROM €¦

Hint Bemerkung
USE_NL(Tabelle1 [Tabelle2€¦]) Der Nested Loops Join wird verwendet.
USE_NL(@Block Tabelle1 [Tabelle2€¦])
USE_NL_WITH_INDEX(Tabelle1 [Tabelle2€¦]) Der Nested Loops Join wird verwendet, wenn mindestens eine der Tabellen den erforderlichen Index besitzt.
USE_NL_WITH_INDEX(@Block Tabelle1 [Tabelle2€¦])
NOT_USE_NL(Tabelle1 [Tabelle2€¦]) Der Nested Loops Join wird verhindert.
NOT_USE_NL(@Block Tabelle1 [Tabelle2€¦])
USE_MERGE(Tabelle1 [Tabelle2€¦]) Der Merge Join wird verwendet.
USE_MERGE(@Block Tabelle1 [Tabelle2€¦])
NOT_USE_MERGE(Tabelle1 [Tabelle2€¦]) Der Merge Join wird verhindert.
NOT_USE_MERGE(@Block Tabelle1 [Tabelle2€¦])
USE_HASH(Tabelle1 [Tabelle2€¦]) Der Hash Join wird verwendet.
USE_HASH(@Block Tabelle1 [Tabelle2€¦])
NOT_USE_HASH(Tabelle1 [Tabelle2€¦]) Der Hash Join wird verhindert.
NOT_USE_HASH(@Block Tabelle1 [Tabelle2€¦])

Quellen (Stand 29.11.2010):
J. Ahrends (2005): Oracle10g für den DBA, S. 609ff.
J. Gennick (2004: Oracle SQL*Plus: the definitive guide, S. 396f.
M. Gurry (2002): Oracle SQL-Tuning: kurz & gut, S. 60ff.
S.  Haas (2006): Oracle Tuning in der Praxis, S. 247f.
http://oracle-online-help.blogspot.com/2007/03/nested-loops-hash-join-and-sort-merge.html
http://www.dba-oracle.com/t_oracle_sorting.htm
http://www.geekinterview.com/question_details/15261

Die mobile Version verlassen