ITPub博客

首页 > 数据库 > Oracle > 绑定变量 + bind peeking

绑定变量 + bind peeking

原创 Oracle 作者:Power08 时间:2013-12-02 16:28:43 0 删除 编辑

一、绑定变量

    提到绑定变量,就不得不了解硬解析与软解析。硬解析简言之即一条SQL语句没有被运行过,处于首次运行,则需要对其进行语法分析,语义识别,跟据统计信息生成最佳的执行计划,然后对其执行。而软解析呢,则是由于在library cache已经存在与该SQL语句一致的SQL语句文本、运行环境,直接执行即可。软解析同样经历语法分析,语义识别,且生成hash value ,接下来在library cache搜索相同的hash value ,如存在在实施软解析。

 

二、bind peeking

使用绑定变量可以减少SQL PARSE,但是使用绑定变量有一个不好的地方,就是对于访

问具有倾斜的列,可能使用错误的执行计划。Oracle 9i之前,如果WHERE 条件里面全

部使用绑定变量,那么只能使用固定的选择性参数来确定执行计划。缺省值的方式可能生成不好的执行计划。所以Oracle 9i就出现了一个新的技术,bind peeking。什么是bind peeking

Bind Peeking是Oracle 9i中引入的新特性,它的作用就是在SQL语句硬分析的时候,查看一下当前SQL谓词的值,以便生成最佳的执行计划。而在oracle 9i之前的版本中,Oracle 只根据统计信息来做出执行计划。

要注意的是,Bind Peeking只发生在硬分析的时候,即SQL被第一次执行的时候,之后的变量将不会在做peeking。我们可以看出,Bind peeking并不能最终解决不同谓词导致选择不同执行计划的问题,它只能让SQL第一次执行的时候,执行计划选择更加准确,并不能帮助OLAP系统解决绑定变量导致执行计划选择错误的问题。如果某个列的倾斜性很厉害,那么使用BIND PEEKING就是不安全的,因为不同的参数代入,只能走第一次执行时的执行计划,那么执行计划就像掷色子一样,要靠运气了。碰到这种情况,应用就不应该使用绑定变量,而应该改为直接值了。

这时可以使用刷新一下共享池alter system flush shared_pool;

  或者alter session set "_optim_peek_user_binds"=false;

我们可以通过隐含的参数来调整数据库默认的bind peeking行为: _OPTIM_PEEK_USER_BINDS。 如果我们想关闭Bind Variable Peeking,我们可以设置该参

数为False 即可。

SQL>alter session set "_optim_peek_user_binds"=false

 

三、绑定变量的优缺点及使用场合

    优点:

        可以在library cache中共享游标,避免硬解析以及与之相关的额外开销

        在大批量数据操作时将呈数量级来减少闩锁的使用,避免闩锁的竞争

     

    缺点:

        绑定变量被使用时,查询优化器会忽略其具体值,因此其预估的准确性远不如使用字面量值真实,尤其是在表存在数据倾斜(表上的数

        据非均匀分布)的列上会提供错误的执行计划。从而使得非高效的执行计划被使用。

来自 “ ITPUB博客 ” ,链接:http://blog.itpub.net/29014732/viewspace-1061874/,如需转载,请注明出处,否则将追究法律责任。

上一篇: truncate 研究
请登录后发表评论 登录
全部评论

注册时间:2013-07-01

  • 博文量
    17
  • 访问量
    44582