DBAtlas · Atlas für Datenbankbetrieb

Nicht akzeptierte Pläne einer SQL Plan Baseline evolvieren

OraclePerformance

Befehl

-- 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.

In DBAtlas öffnen →

Verwandte Einträge