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

Gibt es eine Möglichkeit, Oracle zu zwingen, den Plan einer Abfrage zu ändern, ohne Hinweise zu verwenden?

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:

  1. SQL-Plan-Baseline - Ersetzen Sie einen Plan durch einen anderen Plan.
  2. 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.
  3. 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.
  4. 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.
  5. 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';
  6. Systemsteuerung - Ähnlich wie oben, gilt aber für das gesamte System.
  7. 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.
  8. DBMS_ADVANCED_REWRITE - Ändern Sie eine Abfrage in eine andere Abfrage.
  9. 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.
  10. 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.
  11. 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.