DOAG Datenbank Kolumne: Oracle-Ausführungsplan-Managementtools im Überblick und SQL Patch im Detail

  • Erstellt von Christian Pfundtner
  • Datenbank Kolumne, Datenbank

Die Oracle-Datenbank kennt (für DBAs) verschiedene Methoden, um den Ausführungsplan eines Statements zu beeinflussen.

Es handelt sich dabei um SQL Baseline Management, SQL Profiles sowie SQL Patches. Alle anderen Themen, wie aktuelle Statistiken oder Instance Parameter, lassen wir für diesen Artikel außen vor.

Oracle-Datenbanken und abgespeicherte Ausführungspläne (Stored Execution Plans)

SQL Baseline Management
SQL Baseline Management gibt es grundsätzlich für alle Datenbank-Editionen. Allerdings ist der Funktionsumfang bei der Oracle Standard Edition so eingeschränkt, dass es oft nicht sinnvoll eingesetzt werden kann. Die Funktionalität besteht darin, dass man zuerst die aktuellen (hoffentlich guten) Ausführungspläne persistiert und sie dann aktiviert. Findet der Optimizer einen neuen Ausführungsplan, wird dieser auch weiterhin gespeichert, aber nicht aktiv genutzt. Mittels ENVOLVE wird die Laufzeit verifiziert. Ist die Laufzeit besser, wird der neue Ausführungsplan freigeschaltet und darf in Zukunft genutzt werden.

SQL Profiles
SQL Profiles setzen neben der Oracle Enterprise Edition auch die kostenpflichtigen Diagnostic und Tuning Packs voraus. Hier kann man mit Hilfe des SQL Tuning Advisors alternative Ausführungspläne für Statements erzeugen und für die Nutzung hinterlegen.

SQL Patch
Die SQL Patches dienen dazu, einem SQL Statement manuell einen anderen Ausführungsplan beizubringen, wenn der Ausführungsplan in einen Oracle-Fehler läuft bzw. wenn der aktuelle Ausführungsplan zu langsam ist. SQL Patches sind in allen Oracle-Editionen erlaubt. Grundsätzlich sollten Entwickler lieber ihre Statements direkt optimieren und nicht auf SQL Patches setzen. DBAs haben oft keine Möglichkeit, ein SQL Statement zu beeinflussen – hier kann SQL Patch die Lösung sein.

Nachdem SQL Patch in allen Datenbanken-Editionen zur Verfügung steht, ist es sinnvoll, sich diese Funktionalität genauer anzusehen.

SQL Patch im Detail
Mit SQL Patch kann man jedem SQL Statement zusätzliche Optimizer Hints mitgeben. Schauen wir uns das in einem kurzen Beispiel an:

select /* STMT */ first_name, salary
   from employees 
 where salary > 5000
    and First_name like '%eter';


Das Statement macht einen Full Table Scan auf der Tabelle Employees. Mit Hilfe der Query Block Information, die man mit DBMS_XPLAN gemeinsam mit dem Execution Plan ausgeben kann, ist es möglich, beispielsweise einen INDEX Hint mitzugeben:

declare
   v_name varchar2(128);
begin
   v_name :=
dbms_sqldiag.create_sql_patch(sql_id=>'g6pauu7gt9h8b', -
hint_text=>'INDEX(@SEL$1 EMPLOYEES EMP_NAME_IX)', -
name=>'DBM_TUNING_SQL_PATCH_1');
end; /


Führt man das Statement wieder aus (beispielsweise mit SQL*PLUS Autotrace), sieht man, ob der SQL Patch gezogen hat. Dies steht ganz unten in den Notes:

Note
-----
   - SQL patch "DBM_TUNING_SQL_PATCH_1" used for this statement


Natürlich muss man auch überprüfen, ob der Ausführungsplan wirklich so aussieht, wie man es haben möchte.

Eine ausführlichere Version dieses Artikels mit ausführlichen Beispielen und Tipps finden Sie auf https://www.database-blog.at/2023/02/27/performance-by-example-fur-dbas-sql-patching/.