Es gibt mindestens 11 Möglichkeiten, einen Plan zu steuern, ohne die Abfrage zu ändern. Sie sind unten grob in der Reihenfolge ihrer Nützlichkeit aufgelistet:
- SQL-Plan-Baseline - Ersetzen Sie einen Plan durch einen anderen Plan.
- SQL-Profile - Fügen Sie den Plänen "korrigierende" Hinweise hinzu. Beispielsweise könnte ein Profil sagen:„Dieser Join gibt 100-mal mehr Zeilen zurück als erwartet“, was den Plan indirekt ändert.
- Gespeicherte Gliederung - Ähnlich in der Idee wie SQL Plan Baseline, aber mit weniger Funktionen. Diese Option ist einfacher zu verwenden, aber weniger leistungsfähig und wird nicht mehr unterstützt.
- DBMS_STATS.SET_X_STATS - Das manuelle Ändern von Tabellen-, Spalten- und Indexstatistiken kann Pläne erheblich ändern, indem Objekte künstlich teurer oder billiger aussehen.
- Sitzungssteuerung - Zum Beispiel
alter session set optimizer_features_enable='11.2.0.3';
. Es gibt nicht immer hilfreiche Parameter. Aber einer der OPTIMIZER_*-Parameter kann helfen, oder Sie können den Plan mit einem undokumentierten Hinweis ändern oder eine Funktion wie diese deaktivieren:alter session set "_fix_control"='XYZ:OFF';
- Systemsteuerung - Ähnlich wie oben, gilt aber für das gesamte System.
- DBMS_SPD - Eine SQL-Plan-Direktive ähnelt einem Profil dahingehend, dass sie dem Optimierer einige korrigierende Informationen liefert. Aber das funktioniert auf einer niedrigeren Ebene, über alle Pläne hinweg und ist neu in 12c.
- DBMS_ADVANCED_REWRITE - Ändern Sie eine Abfrage in eine andere Abfrage.
- Virtuelle private Datenbank - Ändern Sie eine Abfrage in eine andere Abfrage, indem Sie Prädikate hinzufügen. Es ist nicht für die Leistung gedacht, aber Sie können es wahrscheinlich missbrauchen, um Indexzugriffspfade zu ändern.
- SQL-Übersetzungsframework - Ändern Sie eine Abfrage in eine andere Abfrage, bevor sie überhaupt analysiert wird. Dies kann dazu führen, dass völlig "falsches" SQL ausgeführt wird.
- SQL-Patch (dbms_sqldiag internal.i_create_patch) - Ändern Sie eine Abfrage in eine andere Abfrage. Ähnlich wie DBMS_ADVANCED_REWRITE, aber undokumentiert und vielleicht etwas leistungsfähiger.