1.执行计划基线可以开启的理由
(1)
优化器 capture_sql_plan_baselines
控制sql计划管理的所有计划的自动捕获,这是一个常见的误解。事实上,optimizer_capture_sql_plan_baselines
仅控制特定sql语句的第一个计划的捕获。也就是说,仅适用于当前没有任何计划记录在计划历史记录中的SQL语句。
第一个捕获总是放在语句的SQL计划基线中——它被启用并接受。
--执行计划历史
select distinct SQL_ID,PLAN_HASH_VALUE,to_char(TIMESTAMP,'yyyymmdd hh24:mi:ss') TIMESTAMP
from dba_hist_sql_plan
where SQL_ID='68wnxdjxwwn2h' order by TIMESTAMP;
(2)
一旦存在由SQL_HANDLE标识的SQL语句,优化器_capture_SQL_plan_baselines就不再对捕获其他计划有任何影响。
每当optimizer_use_sql_plan_baselines=TRUE时,为语句找到的新计划将记录在历史记录中。
创建这些计划是为了使其可用于计划演变,但创建为不可接受,因此在验证之前不会使用这些计划。
此演进过程使用DBMS_SPM运行。EVOLVE_SQL_PLAN_BASELINES。
如果一个固定的计划在基线中——也就是说,对于该语句存在一个已启用、已接受和已固定的计划——则该
SQL语句不可用于计划演变。因此,将基线中计划的FIXED属性设置为YES也会禁用此捕获过程。
(3)
如果您不希望为具有基线的SQL语句捕获其他计划,则必须将基线中的计划设置为FIXED=YES。
"固定"应理解为不应制定计划。(请注意,您许多人都需要FIXED=YES和ENABLED=YES,在11g上这是需要的。)
(4)
如果希望将具有基线的SQL语句的附加捕获计划标记为ACCEPTED=YES,则必须使用DBMS_SPM对其进行演化。
EVOLVE_SQL_PLAN_BASELINES。(注意:在12c中,除非您禁用,否则进化过程将在维护窗口期间自动运行。)
您可以使用verify=>"NO"强制接受它们,而无需验证它们是否运行良好。
注意:请记住,只执行一次的SQL语句不会从SQL计划基线中受益。
即使optimizer_capture_sql_plan_baselines为TRUE,自动计划捕获也仅发生在已执行至少两次的sql语句上。
2.总结
执行计划基线管理是可以开启的。
开启后人工介入的机会增多。