使用SQL Profile来稳定执行计划
Automatic类型的SQL Profile
DECLARE
my_task_name VARCHAR2 (30);
my_sqltext CLOB;
BEGIN
my_sqltext := 'select /*+ no_index(t1 idx_t1) */ * from t1 where n=1';
my_task_name :=
DBMS_SQLTUNE.create_tuning_task (
sql_text => my_sqltext,
user_name => 'SCOTT',
scope => 'COMPREHENSIVE',
time_limit => 60,
task_name => 'my_sql_tuning_task_3',
description => 'Task to tune a query on table t1');
END;
/
begin
dbms_sqltune.execute_tuning_task(task_name=>'my_sql_tuning_task_3');
end;
/
set long 9000
set longchunksize 1000
set linesize 800
select dbms_sqltune.report_tuning_task('my_sql_tuning_task_3') from dual;
Automatic类型的SQL Profile可以在不改变目标SQL的SQL文本的情况下改变执行计划
Manual类型的SQL Profile
Manual类型的SQL Profile可以在不改变目标SQL的SQL文本的情况下改变执行计划
使用SPM来稳定执行计划
SPM的推出彻底地解决了执行计划稳定性的问题,它既能够主动地稳定执行计划,又保留了继续使用执行效率更高的执行计划的机会。
自动捕获产生SQL PLAN BASELINE
DBA_SQL_PLAN_BASELINES中的列ENABLED和ACCEPTED用来描述SQL Plan Baseline对应的执行计划是否能被Oracle启用
OPTIMIZER_CAPTURE_SQL_PLAN_BASELINES用于控制是否开启自动捕获SQL Plan Baseline,默认值为FALSE。
OPTIMIZER_USE_SQL_PLAN_BASELINES用于控制是否启用SQL Plan Baseline,默认值为TRUE。
手工生成SQL PLAN BASELINE
针对目标SQL使用DBMS_SPM.LOAD_PLANS_FROM_CURSOR_CACHE手工生成其初始化执行计划对应的SQL Plan Baseline,语法如下:
dbms_spm.load_plans_from_cursor_cache
(
sql_id=>'原目标SQL的SQL_ID'
plan_hash_value=>原目标的PLAN HASH VALUE
)