Nicht akzeptierte Pläne einer SQL Plan Baseline evolvieren
OraclePerformanceBefehl
-- 1) Plans waiting for acceptance:
SELECT sql_handle, plan_name, origin, enabled, accepted, fixed,
TO_CHAR(created,'YYYY-MM-DD HH24:MI') AS created
FROM dba_sql_plan_baselines
WHERE accepted = 'NO'
ORDER BY created DESC;
-- 2) Evolve task: test-executes the candidate plan against the accepted plan
VAR tname VARCHAR2(128)
VAR ename VARCHAR2(128)
BEGIN
:tname := DBMS_SPM.CREATE_EVOLVE_TASK(
sql_handle => '<sql_handle>',
time_limit => 600,
task_name => 'EVOLVE_<sql_handle>');
:ename := DBMS_SPM.EXECUTE_EVOLVE_TASK(task_name => :tname);
END;
/
SET LONG 1000000 LONGCHUNKSIZE 1000000 LINESIZE 200 PAGESIZE 0
SELECT DBMS_SPM.REPORT_EVOLVE_TASK(
task_name => :tname, execution_name => :ename,
type => 'TEXT', level => 'TYPICAL', section => 'ALL')
FROM dual;
-- 3) If the report has recommendations (plans proven better), accept them:
SET SERVEROUTPUT ON
DECLARE
n PLS_INTEGER;
BEGIN
n := DBMS_SPM.IMPLEMENT_EVOLVE_TASK(task_name => :tname);
DBMS_OUTPUT.PUT_LINE(n || ' plan(s) accepted');
END;
/
EXEC DBMS_SPM.DROP_EVOLVE_TASK(task_name => :tname);Was es tut
Existiert eine Baseline, werden vom Optimizer neu gefundene Pläne mit ACCEPTED=NO gespeichert. Der Evolve-Task führt diese Kandidaten testweise gegen den akzeptierten Plan aus und akzeptiert nur die eindeutig besseren.
Wann einsetzen
Für SQL mit Baseline, wenn ein neuer Index oder neue Statistiken einen besseren Plan ergeben haben könnten; um manuell zu entscheiden, ohne auf den automatischen SYS_AUTO_SPM_EVOLVE_TASK (ab 12c) zu warten.
Vorsicht
Erfordert die Enterprise Edition. Evolve führt die SQL tatsächlich aus (bei DML nur den Abfrageteil); setze für schwere SQL time_limit und meide Spitzenzeiten. Erfordert ADMINISTER SQL MANAGEMENT OBJECT und ADVISOR. Als SYS geparste SQL lässt sich nicht evolvieren (ORA-16963); führe es als Anwendungsbenutzer aus.
Verwandte Einträge
- AWR-Snapshot erstellen und AWR-Report zwischen zwei Snapshots erzeugen
- AWR-Diff-Report (Compare Period) zwischen zwei Zeiträumen
- Top Wait Events und Top-SQL der letzten Minuten aus ASH
- ADDM-Analyse ausführen und Report abrufen
- SQL-Monitor-Report abrufen (laufende oder abgeschlossene lange SQL)
- 10046-Trace für eine Session aktivieren/deaktivieren und mit TKPROF zusammenfassen