基础:
从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)