使用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

仅此记录.

时间: 2024-09-20 14:31:43

使用SPM和STA进行固定执行计划的相关文章

【SPM】Oracle如何固定执行计划

[SPM]Oracle如何固定执行计划   1.1  BLOG文档结构图   1.2  前言部分   1.2.1  导读和注意事项 各位技术爱好者,看完本文后,你可以掌握如下的技能,也可以学到一些其它你所不知道的知识,~O(∩_∩)O~: ① 固定执行计划的常用方法:outline.SQL Profile.SPM(重点) ② coe_xfr_sql_profile.sql脚本的使用     Tips:        ① 若文章代码格式有错乱,推荐使用QQ.搜狗或360浏览器,也可以下载pdf格式

SQL Server如何固定执行计划

   SQL Server 其实从SQL Server 2005开始,也提供了类似ORACLE中固定执行计划的功能,只是好像很少人使用这个功能.当然在SQL Server中不叫"固定执行计划"这个概念,而是叫"执行计划指南"(Plan Guide 很多翻译是计划指南,个人觉得执行计划指南稍好一些).当然两者虽然概念与命名不同,实质上它们所说的是相同的事情,当然商业包装是很常见的事情.个人还是觉得"固定执行计划"这个概念叫起来顺口,通俗易懂,执行计

PostgreSQL SQL OUTLINE插件sr_plan (保存、篡改、固定 执行计划)

标签 PostgreSQL , sql plan outline , 执行计划篡改 , query rewrite , sr_plan , pg plan hint 背景 功能较为强大的数据库,通常都有query rewrite的功能,比如JOIN时提升或下推条件,调整JOIN顺序等. 例如 create table a(id int, info text); create table b(id int, info text); create index idx_a_info on a (inf

关键时刻HINT出彩 - PG优化器的参数优化、执行计划固化CASE

背景 有过数据库使用经验的童鞋可曾遇到过SQL执行计划不准确,或者SQL执行计划抖动的问题. PostgreSQL的执行计划与大多数的企业数据库是一样的,都是基于成本优化. 基于成本优化的优化器,在算法靠谱,统计信息准确的前提下,通常得到的执行计划是比较准确的. 那么什么时候执行计划可能不准确呢? 成本估算的算法不好 这个需要内核的不断改进,完善.在没有合理的算法支撑的情况下,内核中往往会带有一些经验值,或者将这些经验值开放给用户设置. 统计信息不准确 PG的统计信息收集调度是几个参数共同决定的

oracle 执行计划改变导致数据库负载过高解决办法

数据库主机负载 这里明显表现系统load 偏高,而且还在上升中:top的进程中,占用cpu都计划100% top - 16:25:39 up 123 days,  1:42,  4 users,  load average: 46.19, 45.08, 43.93 Tasks: 1469 total,  28 running, 1439 sleeping,   0 stopped,   2 zombie Cpu(s): 45.9%us,  1.1%sy,  0.0%ni, 47.1%id,  5

oracle11g中 connect by 语句执行计划改变

从10.2.0.3升级到11.2.0.4的朋友,如果细心会发现,以下sql在11.2.0.4中执行效率变低(该sql主要是获取连接用户获取权限信息) select privilege#,level from sysauth$ connect by grantee#=prior privilege# and privilege#>0 start with grantee#=:1 and privilege#>0 如果你接触是Oracle版本比较多,而且还比较细心,你可能会进一步发现在11.2.0

一个执行计划异常变更的案例 - 外传之查询执行计划的几种方法

之前的几篇文章: <一个执行计划异常变更的案例 - 前传> <一个执行计划异常变更的案例 - 外传之绑定变量窥探> <一个执行计划异常变更的案例 - 外传之查看绑定变量值的几种方法> <一个执行计划异常变更的案例 - 外传之rolling invalidation> <一个执行计划异常变更的案例 - 外传之聚簇因子(Clustering Factor)> 本篇外传主要介绍一些常用的执行计划查看方法. SQL的执行计划实际代表了目标SQL在Orac

查看Oracle执行计划的几种常用方法-系列1

SQL的执行计划实际代表了目标SQL在Oracle数据库内部的具体执行步骤,作为调优,只有知道了优化器选择的执行计划是否为当前情形下最优的执行计划,才能够知道下一步往什么方向. 执行计划的定义:执行目标SQL的所有步骤的组合. 我们首先列出查看执行计划的一些常用方法: 1. explain plan命令 PL/SQL Developer中通过快捷键F5就可以查看目标SQL的执行计划了.但其实按下F5后,实际后台调用的就是explain plan命令,相当于封装了该命令. explain plan

Oracle中基于hint的3种执行计划控制方法详细介绍_oracle

hint(提示)无疑是最基本的控制执行计划的方式了:通过在SQL语句中直接嵌入优化器指令,进而使优化器在语句执行时强制的选择hint指定的执行路径,这种使用方式最大的好处便是方便和快捷,定制度也很高,通常在对某些SQL语句执行计划进行微调的时候我会首选这种方式,不过尽管如此,hint在使用中仍然有很多不可忽视的问题: 使用hint过程中有一些值得注意的细则,首先便是要准确的识别对应的查询块,如果需要使用注释也可以hint中声明:对于使用别名的对象一律使用别名来引用,并且诸如"用户名.对象&quo