首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 其他教程 > 其他相关 >

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

2012-10-11 
【实践】对于绑定变量看执行计划?基础:??从Oracle9i,开始的Bind Peeking(http://www.oraclefans.cn/forum/sh

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

?

基础:

?

?

从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)

?

热点排行