11g新特性-SQL Plan Management

时间:2021-09-09 20:23:25

在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调优集
11g新特性-SQL Plan Management
     begin
          dbms_sqltune.create_sqlset(
               sqlset_name => 'testset1',
               description => 'test sql tuning set to capture awr data'
          );
     end;
     /
11g新特性-SQL Plan Management

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

11g新特性-SQL Plan Management
    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;
    /
11g新特性-SQL Plan Management

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

11g新特性-SQL Plan Management
    declare
        test_plans pls_integer;
    begin
        test_plans := dbms_spm.load_plans_from_sqlset(sqlset_name => 'testset1');
    end;
    /
11g新特性-SQL Plan Management

(2)从Cursor Cache中导出sql plan

11g新特性-SQL Plan Management
 declare
  test_plans pls_integer;
 begin
  test_plans := dbms_spm.load_plans_from_cursor_cache (
  sql_id => '123456789999')
  return pls_integer;
 end;
 /
11g新特性-SQL Plan Management

 

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

查看SQL plan baselines的属性

11g新特性-SQL Plan Management
select sql_handle,
       sql_text,
       plan_name,
       origin,
       enabled,
       accepted,
       fixed,
       autopurge
  from dba_sql_plan_baselines;
11g新特性-SQL Plan Management

将某个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需要设置以下两个参数:

11g新特性-SQL Plan Management
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> 
11g新特性-SQL Plan Management

参数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配置信息:

11g新特性-SQL Plan Management
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> 
11g新特性-SQL Plan Management