Hints

Hints sind Hinweise für den Oracle-Optimizer, wie er den Ausführungsplan erstellen und die SQL-Abfrage ausführen soll. Ein Hint kann bestimmen, welche Operation? der Optimizer auswählen und verwenden soll.

Hints können in den meisten SQL-Abfragen eingesetzt werden und werden in einem Kommentar angegeben. Hints sollen sparsam verwendet werden, denn sie funktionieren nicht immer und es kann vorkommen, dass der Optimizer sie ignoriert und den Ausführungsplan mit anderen Operationen? erstellt. Aus diesem Grund sollen Hints nur in Notfälle verwendet werden, weil sie Verwaltungs-Overhead mit sich bringen und können obsolete werden, wenn sie nach einer DB-Änderung nicht aktualisiert werden. Hints eignen sich aber gut zum Testen.

In dem folgenden Beispiel wird gezeigt, wie ein Hint syntaktisch in einer SQL-Abfrage aufgebaut ist. Bei dem Hint USE_HASH (Tabelle1 Tabelle2) soll der Optimizer bei der Tabellenverknüpfung zwischen Kunden und Auftraege einen HASH JOIN verwenden:

SELECT /*+ USE_HASH (K A) */ K.Kun_Nr, K.Nachname, A.AuftragsNr FROM Kunden K, Auftraege A WHERE A.Kun_Nr = K.Kun_NR;

Die Anzahl von Hints wurde bei Oracle 11g auf 64 reduziert. Die wichtigen Hints werden in der folgenden Tabelle beschrieben.

HintBeschreibung
Hints für Optimierungsverfahren und -ziele
/*+ ALL ROWS */Der Cost-Based-Optimizer soll alle Daten auf einmal zurückliefern. Der beste Durchsatz (weniger Ressource-Verbrauch) soll erzielt werden.
/*+ FIRST_ROWS /Der Cost-Based-Optimizer soll Daten sofort zurückliefern. Die beste Reaktionszeit soll erzielt werden.
Hints für Zugriffsmethoden
/*+ FULL (tabellenname) */Tabellenzugriff über FULL TABLE SCAN
/*+ ROWID (tabellenname) */Tabellenzugriff über TABLE ACCESS BY INDEX ROWID
/*+ INDEX (tabellenname [Indexname,…]) */Indexzugriff über INDEX RANGE SCAN
/*+ INDEX_FSS (tabellenname Indexname) */Indexzugriff über INDEX FAST FULL SCAN
/*+ NO_INDEX (tabellenname Indexname) */Verbietet den Zugriff auf den Index der Tabelle
/*+ INDEX_JOIN (tabellenname Indexname) */Index-Join als Zugriffspfad verwenden
/*+ INDEX_ASC (tabellenname Indexname) */Indexzugriff, Werte in aufsteigender Reihenfolge durchsuchen
/*+ INDEX_DESC (tabellenname Indexname) */Indexzugriff, Werte in absteigender Reihenfolge durchsuchen
Hints für Join-Operationen
/*+ USE_MERGE(tabelle1 [tabelle2, …]) */Tabellenverknüpfung mit MERGE JOIN
/*+ MERGE_AJ */Tabellenverknüpfung mit MERGE JOIN ANTI
/*+ MERGE_SJ */Tabellenverknüpfung mit MERGE JOIN SEMI
/*+ USE_NL (tabelle1 [tabelle2, …]) */Tabellenverknüpfung mit NESTED LOOPS
/*+ NL_AJ */Tabellenverknüpfung mit NESTED LOOPS ANTI
/*+ NL_SJ */Tabellenverknüpfung mit NESTED LOOPS SEMI
/*+ USE_HASH (tabelle1 [tabelle2, …]) */Tabellenverknüpfung mit HASH JOIN
/*+ HASH_AJ */Tabellenverknüpfung mit HASH JOIN ANTI
/*+ HASH_SJ */Tabellenverknüpfung mit HASH JOIN SEMI
Hints für Join-Reihenfolge
/*+ ORDERED */Verknüpfung der Tabellen entsprechend der Reihenfolge der FROM‐Klausel
/*+ LEADING (tabellenname) */Verwendung der angegebenen Tabelle als die erste Tabelle in der Join-Reihenfolge
Hints für die Parallelausführung
/*+ PARALLEL (tabellenname, anzahl_von_parallelen_operationen) */Ermöglicht die parallele Ausführung von Operationen.
/*+ NOPARALLEL (tabellenname) */Verbietet die parallele Ausführung von Operationen.
/*+ APPEND */Neue Datensätze werden in nicht benutze Blöcke ans Ende der Tabelle angefügt. Im APPEND-Modus kann die Performance von Insert-Anweisungen verbessert werden. Standard bei paralleler Verarbeitung.
/*+ NOAPPEND */Deaktivierung des APPEND-Modus.

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

Quellen:

Kategorie: Tuning, H