Oracle SQL执行计划基线总结(SQL Plan Baseline)(2)

DECLARE
 
  l_plans_loaded  PLS_INTEGER;
 
BEGIN
 
  l_plans_loaded := DBMS_SPM.load_plans_from_cursor_cache(sql_id => '1fkh93md0802n',plan_hash_value=>null);
 
END;
 
/
 
备注:可以有多种方式加载,例如可以根据sql文本进行模糊匹配、SQL语句解析的用户名等等方式,具体见文档
 

四、基线的几种状态
 
一个SQL语句对应的基线,我将它们归纳为三种状态
 
1.accepted(可接受),只有这种状态的基线,优化器才会考虑此基线中的执行计划
2.no-accepted(不可接受),这种状态的基线,优化器在SQL语句解析期间不会考虑。这种状态的基线必须通过演化和验证通过后,转变为accepted状态后,才会被优化器考虑使用
3.fixed为yes(固定),这种状态的基线固有最高优先级!比其他两类基线都要优先考虑
 
五、查看基线
 
1、基本视图:dba_sql_plan_baselines、dba_sql_management_config
 
2、底层视图:sqlobj$data 、 sqlobj$  (保存具体的hint),如下查看基线中保存的执行计划语句:
 

select
 
extractvalue(value(d), '/hint') as outline_hints
 
from
 
xmltable('/outline_data/hint'
 
passing (
 
select
 
xmltype(comp_data) as xmlval
 
from
 
sqlobj$data sod, sqlobj$ so
 
where so.signature = sod.signature
 
and so.plan_id = sod.plan_id
 
and comp_data is not null
 
and name like '&baseline_plan_name'
 
)
 
) d;
 
3、通过函数来查看基线的详细信息:
 
select * from table(dbms_xplan.display_sql_plan_baseline(sql_handle=>'SYS_SQL_11bcd50cd51504e9',plan_name=>'SQL_PLAN_13g6p1maja1790cce5f0e'));
 

六、演化基线
 
为了验证基线中一个处于不可接受状态的执行计划是否比一个处于可接受状态的执行计划具有更高的效率,必须通过演化来验证,需要让优化器以不同的执行计划来执行这条SQL语句,观察不可接受状态的执行计划基线是否会带来更好的性能,如果性能确实更高,这个不可接受状态的基线将会转换为可接受状态。演化的方式有两种:
 
1、手工执行运行
 
SELECT DBMS_SPM.evolve_sql_plan_baseline(sql_handle => 'SYS_SQL_xxxxxxxxxxxxx') From dual;
 
还有time_limit/verify/commit几个参数,可以参考文档
 
2、调优包实现基线的自动演化,可以理解为,启动一个调度任务,周期性的检查是否有不可接受状态的基线可以被演化
 

七、修改基线
 
可以通过dbms_spm.alter_sql_plan_baseline包来修改基线的一些属性,主要有如下几个属性
 

1.ENABLED :设置该属性的值为NO告诉Oracle 11g临时禁用某个计划,一个SQL计划必须同时标记为ENABLED和ACCEPTED,否则CBO将忽略它
2.FIXED:设置为YES,那个计划将是优化器唯一的选择[最高优先级],即使如果某个计划可能拥有更低的成本。这让DBA可以撤销SMB的默认行为,对于转换一个存储概要进入一稳定的SQL计划基线特别有用,注意当一个新计划被添加到被标记为FIXED的SQL计划基线,该新计划不能被利用除非它申明为FIXED状态
3.AUTOPURG:设置这个属性的值为NO告诉Oracle 11g无限期保留它,从而不用担心SMB的自动清除机制
4.plan_name : 改变SQL plan 名字
5.description : 改变SQL plan描述
 
语法:
 

SET SERVEROUTPUT ON
 
DECLARE
 
 v_text  PLS_INTEGER;
 
BEGIN
 
 v_text  := DBMS_SPM.alter_sql_plan_baseline(sql_handle  => 'SYS_SQL_xxxxxx',plan_name => 'SYS_SQL_PLAN_xxxxxxxxx',
 
      attribute_name  => 'fixed',attribute_value => 'YES');
 
  DBMS_OUTPUT.put_line('Plans Altered: ' || v_text  );
 
END;
 
/

内容版权声明:除非注明,否则皆为本站原创文章。

转载注明出处:https://www.heiqu.com/b2b7de2fa52feda1e4c56b3b9b05f1ec.html