oracle spa sta 使用,使用SPM和STA进行固定执行计划

在实际的工作中可能遇到SQL执行计性能划退化的可能性,除了研究退化原因以外,我们可能需要固定其执行计划

一、如下列子展示如果在多个执行计划中使用SPM选择正确的执行计划,SPM默认是不会自动建立BASELINE的。但是可以修改参数开启自动建立(optimizer_capture_sql_plan_baselines)

但是建议不要开启,如果开启自动捕获,自动接受,那么可能丧失CBO在判别到数据量变动自动调整SQL的可能,因为自动捕获的第二个执行计划其ACCPECT为NO,除非手动进行演化,演化会验证每个BASELINE效率,从而改变其ACCPECT值。而手动建立的BASELINE其ACCPECT为YES,如下演示如何删除和手动建立一个BASELINE

var temp varchar2(1000);

select 'execute :temp:=dbms_spm.drop_sql_plan_baseline(sql_handle=> ''' || name||''');'

from (select distinct (sql_handle) name from dba_sql_plan_baselines)

select executions,sql_id,a.PLAN_HASH_VALUE,a.CHILD_NUMBER from v$sql a where UPPER(a.SQL_FULLTEXT) like '%SELECT ID%SYN_EVENT%' AND EXECUTIONS>5;

找到SQL_ID,PLAN_HASH_VALUE

EXECUTIONS SQL_ID        PLAN_HASH_VALUE CHILD_NUMBER SQL_TEXT

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

136 9dgag3t1yfp99       806173478            1 SELECT id ,event_id ,event_name ,event_type ,user_id ,            account_no , c

885 9dgag3t1yfp99       676394365            4 SELECT id ,event_id ,event_name ,event_type ,user_id ,            account_no , c

33 d81hzszzxzwcr       676394365            0 SELECT id ,event_id ,event_name ,event_type ,user_id ,            account_no , c

execute :temp :=dbms_spm.load_plans_from_cursor_cache(sql_id=>'9dgag3t1yfp99',plan_hash_value =>676394365);

SELECT * FROM dba_sql_plan_baselines;可以查看是否正常

二、如下列子展示如何使用STA分析语句执行计划的错误,使用PROFILE进行固定,用于可能的执行计划有误,而没有正确的执行计划,也就是说没有出现多个子游标。

1、

variable stmt_task VARCHAR2(64);

variable sts_task VARCHAR2(64);

2、找到

SQL_ID PLAN_HASH_VALUE

进行创建调整任务

EXEC :stmt_task := DBMS_SQLTUNE.CREATE_TUNING_TASK(sql_id => '43914a5zg199h',plan_hash_value=>'2578872466');

3、执行调整任务

EXEC DBMS_SQLTUNE.EXECUTE_TUNING_TASK(:stmt_task);

4、找到其 TASK_NAME和EXE_NAME

select TASK_NAME,LAST_EXECUTION from dba_advisor_tasks where task_name='TASK_2291';

5、查看报告

SELECT DBMS_SQLTUNE.REPORT_TUNING_TASK(task_name => 'TASK_2291',execution_name =>'EXEC_2296' ) from DUAL;

6、如果分析正确可以启用PROFILE

execute dbms_sqltune.accept_sql_profile(task_name => 'TASK_2291',task_owner => 'DBADMIN', replace => TRUE,force_match =>TRUE);

注意PROFILE 高于HINT优先级别

7、删除

execute DBMS_SQLTUNE.DROP_SQL_PROFILE (name => 'SYS_SQLPROF_01497da0ce600000');

select * from  dba_sql_profiles;可以查看你的新建立的profile

仅此记录.

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值