Oracle 11g 执行计划管理1
1. 执行计划管理的工作原理
1.1控制执行计划的稳定性
- 11g之前,可以使用存储大纲(stored outline)和SQL Profile来固定某条SQL语句的执行计划,防止由于执行计划发生变化而导致的性能下降.
- 11g开始,oracle引入了SQL执行计划管理,从而可以让系统自动的来控制SQL语句执行计划的稳定性,进而防止由于执行计划发生变化而导致的性能下降
1.2 11g执行计划管理
- 优化器会为所有执行次数超过一次的SQL语句维护该SQL语句的每个执行计划的历史列表(plan history)。
- 优化器通过维护一个语句执行的日志条目(statement log)来识别该SQL语句是否为第二次执行。一旦优化器认出某条SQL语句为第二次执行,则优化器将该语句所生成的所有不同的执行计划插入到plan history的相关表里。
- 准线(plan baseline)是plan history的一个子集,plan baseline里面的执行计划是用来比较性能好坏的一个依据。
凭什么来判断是否可以使用一个新产生的执行计划呢?就是把该新的执行计划与plan baseline里的计划进行比较来判断。 某个SQL语句的执行计划可以属于plan history,但是不一定属于plan baseline。
1.3 相关名词说明
- SQL Plan Management(SPM):oracle11g 中提供的新特性,用来更好地控制执行计划。
- Plan History:优化器生成的所有执行计划的总称。
- SQL Plan Baseline: Plan History里那些被标记为“ACCEPTED”的执行计划的总称。
- Plan Evolution:把一条执行计划从Plan History里标记为“ACCEPTED”的过程。
- SQL Management Base(SMB): 字典表里保存的执行计划的总称,包括Plan History,SQL Plan Baseline和SQL profile
2.SPM如何捕捉(加载)执行计划
2.1自动捕捉
- 首先把OPTIMIZER_CAPTURE_SQL_PLAN_BASELINES设置成TRUE。
- 从这个时刻开始,所有执行两次以上的SQL语句会被观测,执行计划会进入Plan History。有个别例外的,参见note 788853.1。
- 生成的第一个执行计划被标记为ENABLED并且是ACCEPTED,后续的执行计划会被标记为ENABLED但不是ACCEPTED。
- 这时把OPTIMIZER_CAPTURE_SQL_PLAN_BASELINES设置会FALSE,新的语句将不会创建Baseline。
- 需要注意的是,即使关闭了自动捕捉,针对存在baseline的SQL,由于ACS(自适应游标共享)的作用,仍旧会有新的PLAN生成,新的Plan仍会进入Plan History,标记为ENABLED但不是ACCEPTED。
2.2 批量导入
导入的baseline都会被自动标记为ACCEPTED, Oralce提供六种方式把计划导入到sql plan baseline中:
- 从 SQL Tuning Set STS 导入:DBMS_SPM.LOAD_PLANS_FROM_SQLSET
- 从Cursor Cache中装载:DBMS_SPM.LOAD_PLANS_FROM_CURSOR_CACHE
- 从Stored Outlines中导入: DBMS_SPM.MIGRATE_STORED_OUTLINE
- 从staging table表中导入:dbms_spm.create_stgtab_baseline
- 通过staging table从另外一个系统中移植:
- DBMS_SPM.CREATE_STGTAB_BASELINE
- DBMS_SPM.PACK_STGTAB_BASELINE
- DBMS_SPM.UNPACK_STGTAB_BASELINE
3.执行计划的选择过程
在OPTIMIZER_USE_SQL_PLAN_BASELINES被设置成默认值TRUE,SQl Plan Baseline就会起作用。
- 首先,无论是否存在baseline,oracle都会正常进行硬解析或者软解析,为SQL生成一个执行计划。 由于ACS和bindpeeking的作用,存在baseline的SQL有可能在这时生成一个不同于baseline的执行计划。
- 如果baseline不存在,就按生成的计划执行。如果baseline存在,那么要查看history里是否有这个计划,如果没有,就将这个计划插入,并标记为ENABLED,NON-ACCEPTED.
- 在baseline中查看是否有FIXED的计划存在,如果存在,执行FIXED的计划,如果存在多个FIXED的计划,根据统计信息重新计算cost,选择cost小的那个。
- 如果FIXED的计划不存在,就选择ACCEPTED的计划执行。 如果存在多个ACCEPTED的计划,根据统计信息重新计算cost,选择cost小的那个。
注意:这里每次重新计算cost的代价不大,因为执行计划是已知的,优化器不必遍历所有的可能,只需根据算法计算出已知计划的cost便可。
4.执行计划的演化(evolution)
演化的过程就是把non-accepted 的plan 改成accepted的过程。 对于手工load的执行计划,会自动执行evolving的过程,因此默认就是accepted;而对于自动装载的执行计划,就需要使用EVOLVE_SQL_PLAN_BASELINE函数来实现演化过程
使用DBMS_SPM.EVOLVE_SQL_PLAN_BASELINE这个API来控制执行计划的演化。语法:
DBMS_SPM.EVOLVE_SQL_PLAN_BASELINE (
sql_handle IN VARCHAR2 := NULL, --> NULL表示针对所有SQL
plan_name IN VARCHAR2 := NULL,
time_limit IN INTEGER := DBMS_SPM.AUTO_LIMIT,
verify IN VARCHAR2 := 'YES',
commit IN VARCHAR2 := 'YES' )
RETURN CLOB; 这里由两个标记控制:
(1)Verify:
+ YES (只有性能更好的计划才会被演化)
+ NO (演化所有的计划)
(2)Commit:
+ YES (直接演化)
+ NO (只生成报告) 这里可以通过不同的排列组合,达到不同的效果:
(1)自动接收所有性能更好的执行计划(Verify->YES, Commit->YES)
(2)自动接收所有新的执行计划 (Verify->NO,Commit->YES)
(3)比较性能,生成报告,人工确认是否演化(Verify->NO, Commit->NO)
5.修改已有的Baseline
通过DBMS_SPM.ALTER_SQL_PLAN_BASELINE来完成。
语法:
DBMS_SPM.ALTER_SQL_PLAN_BASELINE (
sql_handle IN VARCHAR2 := NULL,
plan_name IN VARCHAR2 := NULL,
attribute_name IN VARCHAR2,
attribute_value IN VARCHAR2 )
RETURN PLS_INTEGER; 如把某个baseline 标记为FIXED:
SET SERVEROUT ON;
DECLARE
x NUMBER;
BEGIN
x := DBMS_SPM.ALTER_SQL_PLAN_BASELINE (
sql_handle => '&&sql_handle',
plan_name => '&&plan_name',
attribute_name => 'FIXED',
attribute_value => 'YES' );
END;
/
整理自:
http://tech.it168.com/db/2007-07-23/200707231104640.shtml
http://blog.csdn.net/tianlesoftware/article/details/8296524
Oracle 11g 执行计划管理1的更多相关文章
- Oracle 11g 执行计划管理2
1.创建测试数据 SQL> conn NC50/NC50 Connected. SQL)); SQL> insert into tab1 select rownum,object_name ...
- (转)Oracle定时执行计划任务
Oracle定时执行计划任务 在日常工作中,往往有些事情是需要经常重复地做的,例如每天更新业务报表.每天从数据库中提取符合条件的数据.每天将客户关系管理系统中的数据分配给员工做数据库营销……因此我们就 ...
- OCM_第十五天课程:Section6 —》数据库性能调优 _SQL 访问建议 /SQL 性能分析器/配置基线模板/SQL 执行计划管理/实例限制
注:本文为原著(其内容来自 腾科教育培训课堂).阅读本文注意事项如下: 1:所有文章的转载请标注本文出处. 2:本文非本人不得用于商业用途.违者将承当相应法律责任. 3:该系列文章目录列表: 一:&l ...
- 怎样看懂Oracle的执行计划
怎样看懂Oracle的执行计划 一.什么是执行计划 An explain plan is a representation of the access path that is taken when ...
- 【ORACLE】记录通过执行Oracle的执行计划查询SQL脚本中的效率问题
记录通过执行Oracle的执行计划查询SQL脚本中的效率问题 问题现象: STARiBOSS5.8.1R2版本中,河北对帐JOB执行时,无法生成发票对帐文件. 首先,Quartz表达式培植的启 ...
- Oracle的执行计划(来自百度文库)
如何开启oracle执行计划 http://wenku.baidu.com/view/7d1ff6bc960590c69ec37636.html怎样看懂Oracle的执行计划 http://wenku ...
- Oracle sql执行计划解析
Oracle sql执行计划解析 https://blog.csdn.net/xybelieve1990/article/details/50562963 Oracle优化器 Oracle的优化器共有 ...
- Oracle DB 执行用户管理的备份和恢复
• 说明用户管理的备份和恢复与服务器管理的备份和恢复 之间的差异 • 执行用户管理的数据库完全恢复 • 执行用户管理的数据库不完全恢复 备份和恢复的使用类型 数据库备份和恢复的类型包括: • 用户管理 ...
- oracle稳定执行计划1
稳定执行计划 1 策略: Oracle的sql 执行计划在一些场景下会发生变化,导致系统会发生不可知的情况,影响系统的稳定性,特别是关键业务的sql. 比如下面的场景: 统计信息过老,重新收集了统计信 ...
随机推荐
- Oracle GoldenGate 11.2 OGG-01168(转)
为客户部署的Oracle GoldenGate在测试阶段出现如下的错误: 2012-04-24 10:45:20 ERROR OGG-01168 Oracle GoldenGate Deliv ...
- 读写ZIP文件
String zipFile = /D:/+ ".zip"; StringOperator.zip(filePath, zipFile); InputStream is = ...
- HDU 4390 Number Sequence 容斥原理
Number Sequence Time Limit: 10000/3000 MS (Java/Others) Memory Limit: 65536/65536 K (Java/Others) ...
- The Ninth Hunan Collegiate Programming Contest (2013) Problem L
Problem L Last Blood In many programming contests, special prizes are given to teams who solved a pa ...
- HttpWebRequest访问时,错误:(401)未经授权。
HttpWebRequest访问时,错误:(401)未经授权. 某网页,我不想做登录界面,直接使用域的帐号密码来访问.如果网站设置成Window身份验证,单独的页面都没问题,而是通过使用HttpWeb ...
- Bug管理工具的使用介绍(Bugger 2016)
1. Bugger 2016 介绍 Bugger 2016 is the version of Bugger adding support fot Team Foundation Server bug ...
- 初学cocos2dx-3.x之使用Scale9Sprite时的配置问题
今天学习的时候遇到了Scale9Sprite————一张可拉伸的精灵,只要给它设置一下大小,它就会自动拉伸. Scale9Sprite* nineGirl = Scale9Sprite::create ...
- JavaScript数据结构,队列和栈
在JavaScript中为数组封装了大量的方法,比如:concat,pop,push,unshift,shift,forEach等,下面我将使用JavaScript提供的这些方法,实现队列和栈的操作. ...
- ODCA最佳实践翻译:Architecting Cloud-Aware Applications (一)
Architecting Cloud-Aware Applications ** ODCA(Open Data Center Alliance)最佳实践 ** MagicBowen(e.bowen.w ...
- 简单jQuery实现选项框中列表项的选择
这段代码非常的简单,仅仅作为自己的一个小小的记录! ok,先上一个简单的图例,效果如下(注意:这只是一个简单的例子,不过可以根据这个简单的例子,变化出更为复杂的效果)! 代码也非常的简单,如下所示(注 ...