相关的准备知识,请参考我的Blog:
Oracle跟踪事件setevent
http://blog.csdn.net/tianlesoftware/archive/2009/12/13/4977827.aspx
OracleSQL的硬解析和软解析
http://blog.csdn.net/tianlesoftware/archive/2010/04/08/5458896.aspx
Oracle绑定变量
http://blog.csdn.net/tianlesoftware/archive/2009/10/17/4678335.aspx
在oracle9i之后引入了bindpeeking,在第一次分析的时候,优化器会根据绑定变量来确定执行计划。BINDPEEKING只有当该SQL第一次执行的时候,并且在进行HARDPARSE的时候才进行,第二次调用该SQL,就不会再次进行BINDPEEKING,继续使用上一次产生的执行计划。
我们可以通过隐含的参数来调整数据库默认的bindpeeking行为:_OPTIM_PEEK_USER_BINDS。如果我们想关闭BindVariablePeeking,我们可以设置该参数为False即可。
SQL>altersessionset"_optim_peek_user_binds"=false
使用了BindVar能提高性能主要是因为这样做可以尽量避免不必要的硬分析(HardParse)而节约了时间,同时节约了大量的CPU资源。
当一个Client提交一条Sql给Oracle后,Oracle首先会对其进行解析(Parse),然后将解析结果提交给优化器(Optimiser)来进行优化而取得Oracle认为的最优的QueryPlan,然后再按照这个最优的Plan来执行这个Sql语句(当然在这之中如果只需要软解析的话会少部分步骤)。
当Oracle接到Client提交的Sql后会首先在共享池(SharedPool)里面去查找是否有之前已经解析好的与刚接到的这一个Sql完全相同的Sql(注意这里说的是完全相同,既要求语句上的字符级别的完全相同,又要求涉及的对象也必须完全相同)。当发现有相同的以后解析器就不再对新的Sql在此解析而直接用之前解析好的结果了。这里就节约了解析时间以及解析时候消耗的CPU资源。尤其是在OLTP中运行着的大量的短小Sql,效果就会比较明显了。因为一条两条Sql的时间可能不会有多少感觉,但是当量大了以后就会有比较明显的感觉了。
但是,使用绑定变量的一个缺点是,给出的执行计划并不一定就是SQL在真正应用程序里所使用的执行计划。这时我们就可以通过event10053事件来查看。
补充知识:如何在SQLPLUS中查看执行计划:
1)SQL>EXPLAINPLANFOR你的sql语句;
如SQL>EXPLAINPLANFORSELECT*FROMEMPWHEREEMPNO=7369;
2)SELECTplan_table_outputFROMTABLE(DBMS_XPLAN.DISPLAY('PLAN_TABLE'));
10053event对于性能调优是一个很好的辅助工具。它产生的trace文件提供了Oracle如何选择执行计划,为何如此这般得到执行计划的信息。有时对于一个SQL语句,很明显oracle应该使用索引,但是执行计划却没有使用索引。这时10053事件可以提供一些帮助。可以让我们了解为什么没有用索引。
注意:10053只对CBO有效,而且如果一个sql语句已经解析过,就不会产生新的trace信息。
下面这段引用详细的讲了Event10053如何使用,急分几个level。每个level所包含的内容。
HOWTOtracetheCBOworkingouttheexecutionpath(event10053)
TostarttheCBOtraceenterthefollowingcommand:
ALTERSESSIONSETEVENTS='10053tracenamecontextforever,level1';
RuntheSQLthatyouwantotracetheCBOoptimizeron,e.g.
SELECT*
FROMoe_order_headers_v
WHEREheader_id=999
/
Whenthequeryhascompleted,runthefollowingcommandtoswitchthetraceoff:
ALTERSESSIONSETEVENTS'10053tracenamecontextoff';
Thereappearto2levelstothetrace:
ALTERSESSIONSETEVENTS='10053tracenamecontextforever,level1';
ALTERSESSIONSETEVENTS='10053tracenamecontextforever,level2';
Level2isasubsetofLevel1andincludes:
Columnstatistics
SingleAccessPaths
JoinCosts
TableJoinsConsidered
JoinMethodsConsidered(NL/MS/HA)
butLevel1isthemoredetailedofthetwo;aswellasALLoflevel2,italsoincludes:
Parametersusedbytheoptimizer
Indexstatistics
要强调的一点,sqlplus中打开autotrace看到的执行计划实际上是用explainplan命令得到的,explainplan命令不会进行bindpeeking。应该通过v$sql_plan查看SQL的真实的执行计划。
TheExecutionPlanshowstheSQLoptimizer'squeryexecutionpath.ExecutionPlanoutputisgeneratedusingEXPLAINPLANandDBMS_XPLAN.
EXPLAINPLANoutputshowshowOraclerunstheSQLstatementwhenthestatementwasexplained.ThiscandifferfromtheplanduringactualexecutionforaSQLstatement,becauseofdifferencesintheexecutionenvironmentandexplainplanenvironment
OracledoesnotsupportEXPLAINPLANforstatementsperformingimplicittypeconversionofdatebindvariables.Withbindvariablesingeneral,theEXPLAINPLANoutputmightnotrepresenttherealexecutionplan.
Afterthestatementhasexecuted,youcandisplaytheplanbyqueryingtheV$SQL_PLANview.V$SQL_PLANcontainstheexecutionplanforeverystatementstoredinthecursorcache.
<!--EndFragment-->
分享到:
相关推荐
Linux网络编程:绑定( bind )需要注意的问题, 相关教程链接如下: http://blog.csdn.net/tennysonsky/article/details/44057585
本文实例讲述了jquery绑定事件 bind和on的用法与区别。分享给大家供大家参考,具体如下: bind和on都是给元素绑定事件用的,其最大的区别就是事件冒泡 事件冒泡也是委托事件的原型,事件委托就是子类的事情委托给父类...
国内第一本真正意义上从工作经验出发,以作者的心得体会全面论述...书中涉及很多新的性能话题,比如执行计划,bind peeking,并行执行,10046及10053事件,AWR报告等,基本上涵盖了所有Oracle数据库性能方面的知识。
Oracle 中关于变量绑定的解释说明,还是蛮清楚的学习资料。
AM User-bind命令完成IP、MAC地址和端口绑定配置网络管理
eval()方法在运行时使用反射执行后期绑定计算,因此与标准的ASP.NET数据绑定方法bind相比,会导致性能明显下降。它一般用在绑定时需要格式化字符串的情况下。多数情况尽量少用此方法......
bind.exe 说明: 修改默认绑定IP的东东。 对于多穴主机[有多个合法IP],对外连接一般总是使用默认IP,有时候也有可能使用 另外其他的IP,但这些我们是不能控制的,因为大部分软件在绑定IP的时候总是使用0作 为...
bind bind bind bind
RxSwift bind和drive绑定系统控件和自定义控件教程demo代码.演示了使用drive和bind绑定系统控件和自定义控件方法,加了很详细的注释
auto-bind, 自动将方法绑定到它们的类实例 自动绑定 自动将方法绑定到它们的类实例安装$ npm install auto-bind用法const autoBind = require('auto-bind');class Unicorn
v-bind的基本用法 一、本节说明 前面的章节我们学习了如何向页面html标签进行插值操作,那么如果我们想动态改变html标签的属性,该怎么办呢? 这就是我们这节开始要讲的内容v-bind. 二、 怎么做 “:”为v-bind的...
利用bind+dhcpd实现域名动态绑定
Flex Bind数据绑定实例代码 ActionScript 3.0
jQuery的bind的函数在实际应用其实不是特别多,只是他可以绑定一个事件,但不会即时触发,也可以通过unbind来解除绑定。
本文主要介绍了jQuery中绑定事件bind() on() live() one()的异同,具有很好的参考价值,下面跟着小编一起来看下吧
bind - 将表单数据绑定至Go对象
为页面标签使用bind绑定事件,使用jquery改变单行文本框的背景色
boost stl一些常用函数的使用训练