DBAtlas · Atlas d'exploitation des bases de données

Faire évoluer les plans non acceptés d'une SQL plan baseline

OraclePerformances

Commande

-- 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);

Ce que fait la commande

Lorsqu'une baseline existe, les nouveaux plans trouvés par l'optimiseur sont stockés avec ACCEPTED=NO. La tâche d'évolution exécute ces candidats à titre de test face au plan accepté et n'accepte que ceux qui sont nettement meilleurs.

Quand l'utiliser

Pour les SQL avec baseline lorsqu'un nouvel index ou de nouvelles statistiques ont pu produire un meilleur plan ; pour décider manuellement sans attendre la tâche automatique SYS_AUTO_SPM_EVOLVE_TASK (12c+).

Attention

Exige Enterprise Edition. L'évolution exécute réellement le SQL (seulement la partie requête pour les DML) ; définissez time_limit pour les SQL lourds et évitez les heures de pointe. Exige ADMINISTER SQL MANAGEMENT OBJECT et ADVISOR. Les SQL parsés en tant que SYS ne peuvent pas évoluer (ORA-16963) ; exécutez-la en tant qu'utilisateur applicatif.

Ouvrir dans DBAtlas →

Voir aussi