在Oracle中,什么是绑定变量窥探?ide
目标SQL若不使用绑定变量,则当具体输入值一旦发生了变化,目标SQL的SQL文本就会随之发生变化,这样Oracle就能很容易地计算出对应Selectivity和Cardinality的值,进而据此来选择执行计划。但对于使用了绑定变量的目标SQL而言,状况就彻底不同了,由于如今不管对应绑定变量的具体输入值是什么,目标SQL的SQL文本都是如出一辙的。对于使用了绑定变量的目标SQL而言,Oracle能够选择以下两种方法来决定其执行计划:性能
l 使用绑定变量窥探(Bind Peeking)。spa
l 若是不使用绑定变量窥探,那么对于那些可选择率可能会随着具体输入值的不一样而不一样的谓词条件使用默认的可选择率(例如5%)对象
绑定变量窥探(Bind Peeking)是在Oracle 9i中引入的,是否启用绑定变量窥探受隐含参数“_OPTIM_PEEK_USER_BINDS”的控制,该参数的默认值是TRUE,表示在Oracle 9i及其后续的版本中,默认启用绑定变量窥探。blog
绑定变量窥探的优缺点以下所示:it
① 优势:当绑定变量窥探被启用后,每当Oracle以硬解析的方式解析使用了绑定变量的目标SQL时,Oracle都会实际窥探(Peeking)一下对应绑定变量的具体输入值,并以这些具体输入值为标准,来决定这些使用了绑定变量的目标SQL的WHERE条件的Selectivity和Cardinality的值,并据此来选择该SQL的执行计划。须要注意的是,这里这个“窥探(Peeking)”的动做只有在硬解析的时候才会执行,当使用了绑定变量的目标SQL再次执行时(此时对应的是软解析/软软解析),即使此时对应绑定变量的具体输入值和以前硬解析时对应的值不一样,Oracle也会沿用以前硬解析时所产生的解析树和执行计划,而再也不重复执行上述“窥探”的动做。由于有了绑定变量窥探,因此,Oracle在计算目标SQL的WHERE条件的Selectivity和Cardinality的值时,就能够避免使用默认的可选择率,这样就有更大的可能性能获得该SQL准确的执行计划。class
② 缺点:对于那些执行计划可能会随着对应绑定变量具体输入值的不一样而变化的目标SQL而言一旦启用了绑定变量窥探,其执行计划就会被固定下来,至于这个固定下来的执行计划究竟是什么,则彻底倚赖于该SQL在硬解析时传入的对应绑定变量的具体值。这意味着一旦启用了绑定变量窥探,目标SQL在后续执行时就只会沿用以前硬解析所产生的解析树和执行计划,即便当时的执行计划和解析树并不适合于新传入的值。变量
关于绑定变量窥探须要注意如下几点:自适应
(1)在Oracle llg中引入自适应游标共享后,绑定变量窥探这种无论后续传入的绑定变量的具体输入值是什么而一直沿用以前硬解析时所产生的解析树和执行计划的缺点才有所缓解。方法
(2)在不改变SQL语句文本的状况下,让SQL语句从新进行硬解析的方法有:①对SQL语句涉及到的对象执行DDL操做(例如COMMENT语句)。②执行DBMS_SHARED_POOL.PURGE来删除共享池中的游标。③在从新收集统计信息时指定NO_INVALIDATE=>FALSE选项。
绑定变量窥探这种无论后续传入的绑定变量的具体输入值是什么而一直沿用以前硬解析时所产生的解析树和执行计划的特性一直饱受诟病(这种情况一直到Oracle llg中引入自适应游标共享后才有所缓解),由于绑定变量窥探可能使CBO在某些状况下(对应绑定变量的某些具体输入值)所选择的执行计划并非目标SQL在当前情形下的最优执行计划,并且它可能会带来目标SQL执行计划的忽然改变,进而直接影响应用系统的性能。
绑定变量窥探的反作用在于,一旦启用(默认状况下绑定变量窥探就己经被启用),使用了绑定变量的目标SQL就只会沿用以前硬解析时所产生的解析树和执行计划,即便这种沿用彻底不适合当前的情形,即根据第一次传入的值而后固化执行计划。