Join-Operationen des Ausführungsplans (Oracle)

Diese Operationen gehören zu den Ausführungsplanoperationen? und optimieren? die Art, wie zwei Datensatzmengen (Tabellen?, materiatlisierte Sichten,...) mittels einer Join-Operation miteinander verknüpft werden können. Hier geht es um die Fragestellung, wie dieser performanter gestaltet werden kann, um z.B. Hauptspeicherplatz zu sparen, Sortierungen zu vermeiden und ähnliches. Im DBMS? sind die Implementierungen der aus der relationalen Algebra und SQL bekannten Join-Operatoren für unterschiedliste Anwendungsfälle hinsichtlich ihres Laufzeitverhaltens (Performance) optimiert worden. Aus den sich daraus ergebenen verschiedenen Varianten von Ausführungsplänen? entscheidet sich der ORACLE-Optimizer für eine möglichst kostengünstige Variante.

Oracle bietet die folgenden Join-Operationen an:

NESTED LOOPS

Der ORACLE-Optimizer wählt NESTED LOOPS aus, wenn zwei Tabellen gejoint werden, bei denen aber aufgrund der Spalten in der WHERE-Klausel mindestens ein Index genutzt wird. NESTED LOOPS werden häufig bei Fremdschlüssel-Beziehungen zwischen den Tabellen verwendet. Der NESTED LOOPS-Join ist eine Zeilenoperation.

Ein NESTED LOOPS-Join erfolgt in folgenden Schritten: der Optimizer bestimmt zuerst die treibende Tabelle? und bezeichnet sie als äußere Tabelle. Die andere Tabelle bezeichnet er als innere Tabelle. Die äußere Schleife greift auf jede Zeile in der äußeren Tabelle zu und die innere Schleife greift auf jede Zeile in der inneren Tabelle zu. Die äußere Schleife erscheint vor der inneren Schleife im Ausführungsplan. Man kann sich NESTED LOOPS als ineinander verschachtelte Schleifen vorstellen, die alle Datensätze aus der äußeren Tabelle zurückliefern, auf welche die Bedingung zutrifft, und für jeden Datensatz testen, ob die Bedingung auf den Datensatz aus der innere Tabelle übereinstimmt.


HASH JOIN

Der HASH JOIN wird vom ORACLE-Optimizer verwendet, um große Datenmengen aus zwei Tabellen zu verknüpfen. Er kann aber nur ausgewählt werden, wenn es sich in der WHERE-Bedingung um einen Equi-Join handelt. Man kann den Optimizer bei der Erstellung des Ausführungsplans auch anweisen, den HASH JOIN zu benutzen, indem man den Hint USE_HASH(Tabelle1 Tabelle2) in der SQL-Abfrage anwendet.

Der Optimizer konvertiert die kleinere der beiden Tabellen in eine Hash-Tabelle. Die Hash-Tabelle enthält die Hash-Schlüsseln und wird im Hauptspeicher geladen. Über die Hash-Schlüssel können die Speicheradressen der Datensätze berechnet werden. Dabei dient die Hash-Tabelle nur als Zwischenspeicher, damit häufige Zugriffe auf die Tabelle vermieden werden.

Der HASH JOIN hat noch die Merkmale, dass er eine Mengenoperation ist, d.h. er berechnet alle Zeilen in seinen Ergebnissen, bevor er die erste Zeile zurückgibt und dass er auch parallel ausgeführt werden kann.


INDEX JOIN

Der INDEX JOIN ist eine HASH JOIN, der über einen Index ausgeführt wird. Er ist wird vom ORACLE-Optimizer verwendet, weenn alle Index-Spalten in der Anfrage vorkommen.


MERGE JOIN

Die Join-Operation MERGE JOIN, auch als SORT MERGE JOIN bekannt, wird vom ORACLE-Optimizer normalerweise dann ausgewählt, wenn kein Index zur Verfügung steht oder ein Index von Abfragesyntax deaktiviert wird. Es ist auch nötig, dass mindestens ein Gleichheits-Prädikat in der Join-Bedingung enthalten ist, also ein Equi-Join. Der Optimizer erwartet auch, dass die beiden Tabellen nach den Join-Attributen schon sortiert sind. Man kann den ORACLE-Optimizer bei der Erstellung des Ausführungsplans auch anweisen, den MERGE JOIN zu benutzen, indem man den Hint USE_MERGE(Tabelle1 Tabelle2) in der SQL-Abfrage verwendet.

Die Verknüpfung der Tabellen erfolgt bei MERGE JOIN in zwei Schritte: zuerst wird die Operation TABLE ACCESS FULL an die beiden Tabellen angewendet, um die Zeilen jeder Tabelle zu durchsuchen. Grundsätzlich sollte die kleinere Tabelle zuerst gelesen werden. Der MERGE JOIN führt dann schließlich die Ergebnisse zusammen. Für jede Zeile in der linken Tabelle liest die Operation alle übereinstimmenden Zeilen der rechten Tabelle, indem er auf die Zeilen in sortierter Reihenfolge zugreift.

Als Mengenoperation ist der MERGE JOIN nur für große Datenmengen geeignet, weil die Reaktionszeit sehr langsam ist. Eine Mengenoperation gibt die Datensätze erst an die nächste Operation zurück, nachdem alle Datensätze verarbeitet wurden.


MERGE JOIN CARTESIAN

Die Operation MERGE JOIN CARTESIAN, der oft mit dem Sortiervorgang BUFFER SORT in dem Ausführungsplan vorkommt, ist die Folge von einem Join ohne Join-Bedingung (WHERE-Bedingung ). Daraus bildet es sich das kartesische Produkt (Kreuzprodukt) zweier Tabellen. Als Ergebnismenge wird jeder Datensatz der einen Tabelle mit jedem Datensatz der anderen Tabelle kombiniert. Dieses Vorgehen macht das kartesische Produkt sehr kostenaufwendig, weil n*m große Ergebnismengen entstehen, wobei n, m die Anzahl der Datensätze in den beteiligten Tabellen sind. Als Mengenoperation werden erst alle Datensätze an die nächste Operation weitergegeben, nachdem alle Zeilen verarbeitet wurden.


Siehe auch: SQL-Tuning?, Ausführungsplan einer SQL-Abfrage, Statistiken, Hints, Werkzeuge zum SQL-Tuning

Quellen:

  • Alapati, Sam R./Kuhn, Darl/Padfield, Bill: "Oracle Database 11g Performance Tuning Recipes: A Problem-solution Approach", Apress, 2011, ISBN 978-1-4302-3662-7
  • Burleson, Donald.: "Oracle SQL Tuning", Rampant TechPress, 2004, ISBN 978-0-9823061-5-4
  • Dyke, Julian: "Optimizer Operations, Hints, Features"
  • Haas, Frank: "Oracle Tuning in der Praxis", 10/2009, ISBN 3-446-41907-1
  • Hotka, Dan: "Oracle SQL Tuning“, Createspace, 2007, ISBN 978-0-07-148474-9
  • Niemiec, Richard J.:"Oracle Database 11g Release 2 Performance Tuning Tips & Techniques", Oracle Press, Osborne/McGrawHill, 2012, ISBN 978-0-07-178026-1
  • Price, Jason: "Oracle Database 11g SQL – Master SQL and PL/SQL in the Oracle Database", Kap. 16, Oracle Press, MC Graw Hill, 2007, ISBN 978-0-07-149850-0
  • Oracle® Database Dokumentation: SQL Language Reference 11g Release 2, E26088-02, 07/2012
  • Oracle® Database Dokumentation: SQL Performance Guide, E16638-07, 08/2012
  • Sideris Courseware Corp.: "Oracle Database 11g R2 SQL Tuning", Sideris Courseware, 2011, ISBN
  • The Oracle FAQ Site: Oracle SQL Tuning Guide
  • TAKTUM Informatik GmbH: "Oracle Tuning und Optimierung Tutorial", Büren

Kategorie: Tuning, J