--因为生产环境运行的sql变化较快,版本号公布比較频繁,造成sql的运行计划不是非常稳定。常常会有一些性能非常查的sql出现

--对于这些sql,我们能够使用sql_plan_baseline对运行计划进行绑定,从而使运行计划固定下来

--前提是sql最好使用绑定变量。就算有的没有绑定变量,确定字段的值不会改变才行。由于是针对sql_id进行的绑定,假设sql文本改变,绑定也就无意义了

详细步骤:

--1、找到问题sql,假设查询sql的运行计划,假设有合适的运行计划。直接进行绑定

--查询sql运行计划相应的PLAN_HASH_VALUE

SELECT DISTINCT(PLAN_HASH_VALUE) FROM V$SQL_PLAN t WHERE SQL_ID = '010cv4dvf6swv' and child_number='0'

--绑定好的运行计划:

declare

  l_pls number;

begin

  l_pls := DBMS_SPM.LOAD_PLANS_FROM_CURSOR_CACHE(sql_id  => '524wzct86gu1d',

                                                 plan_hash_value => 2554538542,

                                                 enabled         => 'YES');

end;

/

2、假设没有合适的运行计划,就要通过自己分析,运用一些hint让sql产生比較好的运行计划

--须要绑定的sql

--oldSQL(id PLAN_HASH_VALUE)

524wzct86gu1d

2554538542

--新的sql

--newSQL(id PLAN_HASH_VALUE)

010cv4dvf6swv

756701203

--查询新的运行计划的sql_id

select * from v$sql where sql_text like '%zhruoyu%' --通过在hint中加一下特殊字符来查找

---新建制定SQLID的BASELINE依据old_sql id,PLAN_HASH_VALUE

declare

  l_pls number;

begin

  l_pls := DBMS_SPM.LOAD_PLANS_FROM_CURSOR_CACHE(sql_id    => '524wzct86gu1d',

                                                 plan_hash_value => 2554538542,

                                                 enabled         => 'NO');  --注意这里是no

end;

/

---确定原始运行计划的 sql_handle

select sql_handle, plan_name, origin, enabled, accepted,fixed,creator,optimizer_cost,sql_text


from dba_sql_plan_baselines where origin = 'MANUAL-LOAD' order by created desc

 

SQL_HANDLE:SQL_66108ad9595208fc                                     

PLAN_NAME:SQL_PLAN_6c44av5cp427w65e519aa

---与正确的运行计划做关联

declare

  l_pls number;

begin

  l_pls := DBMS_SPM.load_plans_from_cursor_cache(sql_id          => '010cv4dvf6swv', -- new_SQL_ID'

                                                 plan_hash_value => 756701203, --new_plan_hash_value

                                                 sql_handle      => 'SQL_66108ad9595208fc' --OLD_handle

                                                 );

end;

/

---删除错误的运行计划

declare

  l_pls number;

begin

  l_pls := DBMS_SPM.DROP_SQL_PLAN_BASELINE(sql_handle => 'SQL_66108ad9595208fc', --sql_handle_for_original

                                           plan_name  => 'SQL_PLAN_6c44av5cp427w65e519aa' --sql_plan_name_for_original                                       


                                           );

end;

/

--检查一下

select sql_handle, plan_name, origin, enabled, accepted,fixed,creator,optimizer_cost,sql_text


from dba_sql_plan_baselines where origin = 'MANUAL-LOAD' and sql_handle='SQL_66108ad9595208fc'

--完毕

绑定运行计划sql_plan_baseline的更多相关文章

  1. 【故障处理141119】一次数据库不繁忙时一条sql语句2个运行计划导致业务超时的故障处理

    1,故障描写叙述: 一条select有两个运行计划.在sqlplus中运行选择好的运行计划.仅仅要40毫秒.而在程序中运行选择了差的运行计划,要1分23秒左右,导致前台业务超时报错. 2.故障解决: ...

  2. 使用SQL Profile及SQL Tuning Advisor固定运行计划

    SQL Profile就是为某一SQL语句提供除了系统统计信息.对象(表和索引等)统计信息之外的其它信息,比方执行环境.额外的更准确的统计信息,以帮助优化器为SQL语句选择更适合的执行计划. SQL ...

  3. Spark入门实战系列--6.SparkSQL(中)--深入了解SparkSQL运行计划及调优

    [注]该系列文章以及使用到安装包/测试数据 可以在<倾情大奉送--Spark入门实战系列>获取 1.1  运行环境说明 1.1.1 硬软件环境 线程,主频2.2G,10G内存 l  虚拟软 ...

  4. 运行计划之误区,为什么COST非常小,SQL却跑得非常慢?

    转载请注明出处:http://blog.csdn.net/guoyjoe/article/details/38321477 2014.7.31就晚20:30 My Oracle Support组猫大师 ...

  5. oracle分区表运行计划

    分区表有非常多优点,以大化小,一小化了,加上并行的使用,在loap中能往往能提高几十倍甚至几百倍的效果. 当然表设计得不好也会适得其反.效果比普通表跟糟糕. 为了更好的使用分区表,这里看一下分区表的运 ...

  6. index_ss hint 使用的运行计划变化对照

    index_ss  hint 使用的运行计划变化对照 当中 buffer 代表:当前操作中发生的内存读次数,包括一致性读和当前读 尽管 emp 表记录数不多,可是buffer 读内存的次数区别还是有点 ...

  7. SQL Server 性能调优 之运行计划(Execution Plan)调优

    运行计划中的三种 Join 策略 SQL Server 存在三种 Join 策略:Hash Join,Merge Join,Nested Loop Join. Hash Join:用来处理没有排过序/ ...

  8. 使用hint优化Oracle的运行计划 以及 SQL Tune Advisor的使用

    背景: 某表忽然出现查询很缓慢的情况.cost 100+ 秒以上:严重影响生产. 原SQL: explain plan for select * from ( select ID id,RET_NO ...

  9. mysql 运行计划explain具体解释

    explain主要是用来获取一个query的运行计划,描写叙述mysql怎样运行查询操作.运行顺序,使用到的索引,以及mysql成功返回结果集须要运行的行数.能够帮助我们分析 select 语句,让我 ...

随机推荐

  1. vim-ctags-taglist-netrw

    vim配置 在~/.vimrc文件里配置例如以下内容.或者在/etc/vim/vimrc中进行全局配置,经常使用配置例如以下: syntax on set tabstop=4 set nu set s ...

  2. stm32之watchdog

    在嵌入式系统中,由于MCU的工作常常受到来自外界电磁场的干扰,造成程序的跑飞,而陷入死循环,程序的正常运行被打断,由单片机控制的系统无法继续工作,会造成整个系统陷入停滞状态,发送不可预料的后果,所以出 ...

  3. php - 小型微博系统

    效果: 数据库: 项目结构: add.php : 添加微博. conn.php : 数据库配置文件. delete.php : 删除博客代码. disinfo.php : 显示微博详细信息. inde ...

  4. pthread_detach(pthread_self())

    pthread_detach(pthread_self()) 将状态改为unjoinable状态,确保资源的释放.其实简单的说就是在线程函数头加上 pthread_detach(pthread_sel ...

  5. Linux下Nginx+tomcat应用系统性能优化

    软件环境及服务器配置如下: Linux rh6.3,Tomcat7.0.29,Nginx1.2.7 mysql5.1,jdk1.6.0 mysql5.1 memcached 1.4.15 Xeno 2 ...

  6. Eclipse生成Jar包方法

    Eclipse生成jar包   第一:普通类导出jar包,我说的普通类就是指此类包含main方法,并且没有用到别的jar包. 1.在eclipse中选择你要导出的类或者package,右击,选择Exp ...

  7. 02-OC方法、属性

    目录: 一.方法 二.实例变量 三.属性(点语法) 四.初始化方法(自定义构造方法) 回到顶部 一.方法 1 函数与方法有什么区别? 函数只是一个程序的代码段,与类无关. 方法,类的一部分,代表对象可 ...

  8. Flexigrid的编辑功能

    editCells:function(){ if(!isEditing){ isEditing = true; $('tbody tr',$(t)).each(function () { for(va ...

  9. JS乘法口诀表(一行代码)

    (function(c){for(i=1;i<=9;i++){var s='';for(j=1;j<=i;j++){s+=i+'X'+j+'='+i*j+'\t';}c.debug(s); ...

  10. Java并发编程之闭锁CountDownLatch简单介绍

    闭锁相当于一扇门,在闭锁到达结束状态之前,这扇门一直是关闭着的,没有不论什么线程能够通过,当到达结束状态时.这扇门才会打开并容许全部线程通过.它能够使一个或多个线程等待一组事件发生. 闭锁状态包含一个 ...