Oracle Database 12c中引入了一个新的自动系统作业,即SYS_AUTO_SPM_EVOLVE_TASK。 该作业将在每天的自动维护作业窗口中自动执行。 SYS_AUTO_SPM_EVOLVE_TASK负责检索和排序SPM中未被接受的执行计划non-accepted plan以便verification。 当此执行计划经过verified,过该计划满足性能阀值则将被自动接受accepted 。因此,当优化器将一个non-accepted的执行计划加入到SQL statement plan history中,在很多情况下若该计划确实是更好的,则会在第二天被接受并可以使用。 注意该自动task存在时间上的限制为一个小时(默认TIME_LIMIT=3600s),因此可能造成部分计划未被verified。 在此种场景下,下一个维护窗口该task执行时将处理剩余的执行计划。
SYS_AUTO_SPM_EVOLVE_TASK 1 SELECT parameter_name, parameter_value 2 FROM dba_advisor_parameters 3* WHERE task_name = 'SYS_AUTO_SPM_EVOLVE_TASK' SQL> / PARAMETER_NAME PARAMETER_VALUE ------------------------------ ---------------------------------------- DAYS_TO_EXPIRE UNLIMITED END_SNAPSHOT UNUSED END_TIME UNUSED INSTANCE UNUSED JOURNALING INFORMATION MODE COMPREHENSIVE START_SNAPSHOT UNUSED START_TIME UNUSED TARGET_OBJECTS 1 TIME_LIMIT 3600 DEFAULT_EXECUTION_TYPE SPM EVOLVE CON_DBID_MAPPING UNUSED ORA_EM_PARAM1 UNUSED ORA_EM_PARAM2 UNUSED ORA_EM_PARAM3 UNUSED ORA_EM_PARAM4 UNUSED ORA_EM_PARAM5 UNUSED ORA_EM_PARAM6 UNUSED ORA_EM_PARAM7 UNUSED ORA_EM_PARAM8 UNUSED ORA_EM_PARAM9 UNUSED ORA_EM_PARAM10 UNUSED EXECUTION_DAYS_TO_EXPIRE 30 SQLSET_NAME UNUSED SQLSET_OWNER UNUSED ACCEPT_PLANS TRUE _SPM_VERIFY TRUE APPLY_CAPTURED_COMPILENV UNUSED LOCAL_TIME_LIMIT UNUSED 已选择 29 行。 select execution_name,status,execution_start,execution_end from dba_advisor_executions where task_name='SYS_AUTO_SPM_EVOLVE_TASK'; -- time_limit (IN) - Time limit in number of minutes. The time limit -- is global and it is used in the following manner. -- The time limit for first non-accepted plan is equal -- to the input value. The time limit for the second -- non-accepted plan is equal to (input value - time -- spent in first plan verification) and so on. The -- default DBMS_SPM.AUTO_LIMIT means let the system -- choose an appropriate time limit based on the -- number of plan verifications required to be done. -- The value DBMS_SPM.NO_LIMIT means no time limit. DECLARE job BINARY_INTEGER := :job; next_date TIMESTAMP WITH TIME ZONE := :mydate; broken BOOLEAN := FALSE; job_name VARCHAR2 (30) := :job_name; job_subname VARCHAR2 (30) := :job_subname; job_owner VARCHAR2 (30) := :job_owner; job_start TIMESTAMP WITH TIME ZONE := :job_start; job_scheduled_start TIMESTAMP WITH TIME ZONE := :job_scheduled_start; window_start TIMESTAMP WITH TIME ZONE := :window_start; window_end TIMESTAMP WITH TIME ZONE := :window_end; chain_id VARCHAR2 (14) := :chainid; credential_owner VARCHAR2 (30) := :credown; credential_name VARCHAR2 (30) := :crednam; destination_owner VARCHAR2 (30) := :destown; destination_name VARCHAR2 (30) := :destnam; job_dest_id VARCHAR2 (14) := :jdestid; log_id NUMBER := :log_id; BEGIN DECLARE ename VARCHAR2 (30); BEGIN ename := DBMS_SQLTUNE.execute_tuning_task ('SYS_AUTO_SQL_TUNING_TASK'); ename := DBMS_SPM.execute_evolve_task ('SYS_AUTO_SPM_EVOLVE_TASK'); END; :mydate := next_date; IF broken THEN :b := 1; ELSE :b := 0; END IF; END; /* Formatted on 2013/8/4 10:48:19 (QP5 v5.163.1008.3004) */ SELECT pl.signature, pl.category, pl.name, pl.plan_id, DECODE (BITAND (pl.flags, :1), 0, :2, :3) flags, pl.sql_handle, pl.sql_text, pl.comp_data, pl.optimizer_env, pl.bind_data, pl.parsing_schema_name, pl.creator, (CASE /* plan is already accepted */ WHEN (BITAND (pl.flags, :4) <> 0) THEN :5 /* plan has recently been verified */ WHEN (pl.is_auto IS NOT NULL AND pl.last_verified > SYSTIMESTAMP - :6) THEN :7 /* plan's SQL statement hasn't been recently executed */ WHEN (pl.is_auto IS NOT NULL AND pl.last_verified IS NOT NULL AND pl.sql_last_executed < SYSTIMESTAMP - :8) THEN :9 ELSE :10 END) pruned FROM (SELECT so.signature, so.category, so.name, so.plan_id, so.flags, st.sql_handle, st.sql_text, (DECODE ( BITAND (so.flags, 128), 128, (SELECT EXTRACT (XMLTYPE (pl.other_xml), '/*/outline_data').getClobVal () FROM sys.sqlobj$plan pl WHERE pl.signature = so.signature AND pl.category = so.category AND pl.obj_type = so.obj_type AND pl.plan_id = so.plan_id AND pl.other_xml IS NOT NULL), (SELECT sod.comp_data FROM sys.sqlobj$data sod WHERE sod.signature = so.signature AND sod.category = so.category AND sod.obj_type = so.obj_type AND sod.plan_id = so.plan_id))) comp_data, sox.optimizer_env, sox.bind_data, sox.parsing_schema_name, sox.creator, sox.last_verified, sox.optimizer_cost, sox.created, :11 is_auto, (SELECT MAX (last_executed) FROM sys.sqlobj$ ob WHERE ob.signature = so.signature AND ob.obj_type = so.obj_type AND ob.category = so.category) sql_last_executed FROM sys.sqlobj$ so, sys.sqlobj$auxdata sox, sys.sql$text st WHERE (:12 IS NULL OR so.name IN (SELECT EXTRACTVALUE (VALUE (p), '/plan') pname FROM TABLE ( XMLSEQUENCE ( EXTRACT (XMLTYPE (:13), '/plan_list/*'))) p)) AND (:14 IS NOT NULL OR (BITAND (so.flags, :15) <> 0 AND BITAND (so.flags, :16) = 0)) AND so.obj_type = :17 AND so.signature = sox.signature AND so.category = sox.category AND so.obj_type = sox.obj_type AND so.plan_id = sox.plan_id AND so.signature = st.signature) pl ORDER BY DECODE (:18, 0, NULL, pl.name), pl.last_verified NULLS FIRST, pl.sql_last_executed DESC NULLS LAST, pl.optimizer_cost, pl.created, pl.name