【实践】对于绑定变量看执行计划

 

基础:

 

 

从Oracle9i,开始的Bind Peeking

(http://www.oraclefans.cn/forum/showtopic.jsp?rootid=5467&CPages=1)

但是使用绑定变量有一个不好的地方,就是对于访问具有倾斜的列,可能使用错误的执行计划。

 

当SQL第一次执行的时候,优化器会根据绑定变量来确定执行计划(如果存在柱状图)。BIND PEEKING只有当该SQL第一次执行的时候,进行HARD PARSE的时候才进行,第二次调用该SQL,就不会再次进行BIND PEEKING。这种情况下,就存在另外一个风险,如果某个列的倾斜性很厉害,那么使用BIND PEEKING就是不安全的,因为不同的参数代入,只能走第一次执行时的执行计划,那么执行计划就像掷色子一样,要靠运气了。碰到这种情况,应用就不应该使用绑定变量,而应该改为直接值了。

 

BIND PEEKING对于使用绑定变量的情况下,选择较优的执行计划有一定的作用

BIND PEEKING只有在存在柱状图的情况下才能工作

BIND PEEKING只在做HARD PARSE的时候才产生,随后的执行如果不需要HARD PARSE就不会进行BIND PEEKING,这种情况和CURSOR_SHARING无关

由于以上原因,使用绑定变量的时候可以有效的减少PARSE

对于使用不同绑定变量执行计划应该不同的情况,建议不要使用绑定变量,否则可能会产生随机的执行计划(硬分析后的所有执行都使用第一个执行计划,执行计划和第一次执行的参数有关)

 

 

Oracle11g提供新的特性自适应游标共享(Adaptive Cursor Sharing),对于一个同样绑定变量的SQL可以有多个执行计划,从而达到动态优化执行计划的作用(http://dev.firnow.com/course/7_databases/oracle/oraclexl/2008324/107073.html)。

 

 

=================================================================

 

现在最简单的方法: 可以直接查询V$SQL_PLAN表;

 

要强调的一点,sqlplus中打开autotrace看到的执行计划实际上是用explain plan 命令得到的,explain plan 命令不会进行bind peeking。应该通过v$sql_plan查看SQL的真实的执行计划。

http://blog.csdn.net/tianlesoftware/archive/2010/04/29/5544307.aspx

 

你可能感兴趣的:(oracle,sql,jsp,.net,Blog)