在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;
可以从SQL Tuning Set (STS) 和 Cursor Cache中创建sql plan baselines。
(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>