`
qjoycn
  • 浏览: 1217068 次
文章分类
社区版块
存档分类
最新评论

Event 10053 执行计划 绑定变量 Bind peeking

 
阅读更多

相关的准备知识,请参考我的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提交一条SqlOracle后,Oracle首先会对其进行解析(Parse),然后将解析结果提交给优化器(Optimiser)来进行优化而取得Oracle认为的最优的QueryPlan,然后再按照这个最优的Plan来执行这个Sql语句(当然在这之中如果只需要软解析的话会少部分步骤)

Oracle接到Client提交的Sql后会首先在共享池(SharedPool)里面去查找是否有之前已经解析好的与刚接到的这一个Sql完全相同的Sql(注意这里说的是完全相同,既要求语句上的字符级别的完全相同,又要求涉及的对象也必须完全相同)。当发现有相同的以后解析器就不再对新的Sql在此解析而直接用之前解析好的结果了。这里就节约了解析时间以及解析时候消耗的CPU资源。尤其是在OLTP中运行着的大量的短小Sql,效果就会比较明显了。因为一条两条Sql的时间可能不会有多少感觉,但是当量大了以后就会有比较明显的感觉了。

但是,使用绑定变量的一个缺点是,给出的执行计划并不一定就是SQL在真正应用程序里所使用的执行计划。这时我们就可以通过event10053事件来查看。

补充知识:如何在SQLPLUS中查看执行计划:
1SQL>EXPLAINPLANFOR你的sql语句;
SQL>EXPLAINPLANFORSELECT*FROMEMPWHEREEMPNO=7369;
2SELECTplan_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-->
分享到:
评论

相关推荐

Global site tag (gtag.js) - Google Analytics