11g新特性-SQL Plan Management

在11g之前版本,提供了stored outlines(sql概要)特性来保存sql的执行计划。

在11g中,引入了一个新的特性sql计划管理(sql plan management)特性来保存sql性能。

 

数据库自动控制sql执行计划的演变,借助sql plan baselines。 SPM会不时的捕获和评估sql的执行计划,然后建立只包含高效的执行计划的sql plan baselines。 sql plan baselines只会包含那些不会引起sql性能下降的执行计划。

 

当系统遇到以下变化时,可以使用SPM来保存sql的性能信息:

-数据库升级

-新的优化器版本

-优化器参数修改

-系统设置变更

-schema信息和元数据变更

-部署新的应用模块

 

sql plan baselines

sql plan baseline是数据库为每个可重复执行sql语句维护的历史执行计划的集合。这些执行计划只包含数据库可接受的执行计划。

1.自动捕获sql plan baselines
自动捕获需要设置参数optimizer_capture_sql_plan_baselines的值为true,默认是false。

SQL> alter system set optimizer_capture_sql_plan_baselines=true scope=spfile;
2.手动加载sql plan到sql plan baselines
可以从SQL Tuning Set (STS) 和 Cursor Cache中创建sql plan baselines。
【在数据库升级时,当心升级后会性能下降的话,可以在升级前将sql plan导出,升级后再导入】 
(1)从sql tuning set中导出sql plan
     #创建空的sql调优集
     begin

          dbms_sqltune.create_sqlset(

               sqlset_name => 'testset1',

               description => 'test sql tuning set to capture awr data'

          );

     end;

     /

  #使用load_sqlset将sql plan加载到新创建的sql tuning set中

    declare

        test_cursor1 dbms_sqltune.sqlset_cursor;

    begin

        open baseline_cursor for

            select value(p) from table(dbms_sqlture.select_workload_repository('peak baseline',null,null,'elapsed_time',null,null,null,20)) p;

        dbms_sqlset.load_sqlset(sqlset_name => 'testset1',populate_cursor => test_cursor1);

    end;

    /

  #将sql tuning set中的数据导入sql plan baselines

    declare

        test_plans pls_integer;

    begin

        test_plans := dbms_spm.load_plans_from_sqlset(sqlset_name => 'testset1');

    end;

    /

(2)从Cursor Cache中导出sql plan

 declare

  test_plans pls_integer;

 begin

  test_plans := dbms_spm.load_plans_from_cursor_cache (

  sql_id => '123456789999')

  return pls_integer;

 end;

 /

 

管理sql plan baselines使用oracle提供的dbms_spm包。

查看SQL plan baselines的属性

select sql_handle,

       sql_text,

       plan_name,

       origin,

       enabled,

       accepted,

       fixed,

       autopurge

  from dba_sql_plan_baselines;

将某个sql plan修改为accept状态

SQL> exec dbms_spm.alter_sql_plan_baselines(

        sql_handle => SYS_SQL_122222222',

        plan_name => 'SYS_SQL_PLAN_b5429522ee05ab0e',

        attribute_name => 'accepted-status',

        attribute_value => 'YES');

查看某个sql的baseline:

select *

  from table(dbms_xplan.display_sql_plan_baseline(sql_handle => 'SYS_SQL_ba5e12ccae97040f',

                                                  format     => 'basic'));

 


SQL Management Base
sql plan management将sql plan baselines信息存放在一个新的数据字典中--sql management base(SMB)。
SMB被存放在sysaux表空间中。

配置sql management base(SMB)
配置SMB需要设置以下两个参数:

SQL> select parameter_name,parameter_value 

  2  from dba_sql_management_config;



PARAMETER_NAME                 PARAMETER_VALUE

------------------------------ ---------------

SPACE_BUDGET_PERCENT                        10

PLAN_RETENTION_WEEKS                        53



SQL> 

参数space_budget_percent表示SMB可以占用sysaux表空间的比例。默认是10%

SQL> exec dbms_spm.configure('space_budget_percent',40);

SQL> exec dbms_spm.configure ('plan_retention_weeks', 105);

#手动清空SMB

SQL> exec dbms_spm.purge_sql_plan_baseline('SYS_SQL_PLAN_b5429522ee05ab0e');

查看SMB配置信息:

SQL> select PARAMETER_NAME,PARAMETER_VALUE,LAST_MODIFIED,MODIFIED_BY

  2  from dba_sql_management_config;



PARAMETER_NAME                 PARAMETER_VALUE LAST_MODIFIED        MODIFIED_BY

------------------------------ --------------- -------------------- --------------------

SPACE_BUDGET_PERCENT                        10

PLAN_RETENTION_WEEKS                        53



SQL> 


 

 

 

你可能感兴趣的:(sql)