[English]
作者:
fuyuncat
来源:
www.HelloDBA.com
10053 trace文件为我们分析CBO解析SQL语句的过程提供了非常有用的信息。而在Oracle中,为了提高查询计划的正确性,有一个很重要的特性——绑定变量窥视(Bind Variable Peeking)。10053 Trace文件中跟踪到的“窥视”数据,我们可以更加容易理解优化器为什么会选择某一个查询计划。但是,有时我们却发现在Trace文件没有窥视值,而是显示“No bind buffers allocated”。这是为什么呢?
它的直接原因是绑定变量窥视没有被启用,而造成绑定变量窥视没有启用则可能是以下几种原因:
1、绑定变量窥视功能被人为关闭。如果你没有修改过系统参数的话,这个特性默认是打开的。其控制参数是“_optim_peek_user_binds”,它可以在system和session两个级别被修改。
2、10.2.0.1~10.2.0.3上存在Bug:5364143,会导致SQL因为某些原因(内存紧张、DDL等)被重新解析时没有窥视变量数据。以下代码就是在10.2.0.3上运行的,在Trace文件中,就发现没有窥视变量数据:
SQL代码
- SQL> alter system flush shared_pool;
- System altered.
- --session 1:
- SQL> var v_1 varchar2(10);
- SQL> exec :v_1 := 'AAA';
- PL/SQL procedure successfully completed.
- SQL> select object_id from t_test1 where object_name = :v_1;
- OBJECT_ID
- ----------
- 70230
- --Session 2:
- SQL> conn demo/demo
- Connected.
- SQL> var v_1 varchar2(10);
- SQL> exec :v_1 := 'BBB';
- PL/SQL procedure successfully completed.
- SQL> alter session set events '10053 trace name context forever, level 1';
- Session altered.
- SQL> select object_id from t_test1 where object_name = :v_1;
- no rows selected
- SQL> alter session set events '10053 trace name context off';
- Session altered.
3、某些客户端,如Pro*、某些版本的OCI和JDBC,绑定变量窥视没有被启用。10.2.0.4及之前的版本都可能受影响。Oracle已经将其定义为Bug(6981155),并在10.2.0.5和11g中解决。
--- Fuyuncat Mark ---
上一篇: 事务队列等待(Tx Enqueue)深入分析——记录锁 | 下一篇: 10g中构建“高”索引 |
本类中的所有文章 |