HelloDBA [English]
搜索Internet 搜索 HelloDBABA
  Oracle技术站。email: fuyuncat@gmail.com  MSN: fuyuncat@hotmail.com   acoug  acoug 

Q&A: 为什么在10053Trace文件中没有变量值?

[English]

作者: fuyuncat

来源: www.HelloDBA.com

日期: 2009-09-23 03:56:27

分享到  新浪微博 腾讯微博 人人网 i贴吧 开心网 豆瓣 淘宝 推特 Facebook GMail Blogger Orkut Google Bookmarks

    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代码
  1. SQL> alter system flush shared_pool;   
  2.   
  3. System altered.   
  4.   
  5. --session 1:   
  6. SQL> var v_1 varchar2(10);   
  7. SQL> exec :v_1 := 'AAA';   
  8.   
  9. PL/SQL procedure successfully completed.   
  10.   
  11. SQL> select object_id from t_test1 where object_name = :v_1;   
  12.   
  13.  OBJECT_ID   
  14. ----------   
  15.      70230   
  16.   
  17. --Session 2:   
  18. SQL> conn demo/demo   
  19. Connected.   
  20. SQL> var v_1 varchar2(10);   
  21. SQL> exec :v_1 := 'BBB';   
  22.   
  23. PL/SQL procedure successfully completed.   
  24.   
  25. SQL> alter session set events '10053 trace name context forever, level 1';   
  26.   
  27. Session altered.   
  28.   
  29. SQL> select object_id from t_test1 where object_name = :v_1;   
  30.   
  31. no rows selected   
  32.   
  33. SQL> alter session set events '10053 trace name context off';   
  34.   
  35. Session altered.  

    3、某些客户端,如Pro*、某些版本的OCI和JDBC,绑定变量窥视没有被启用。10.2.0.4及之前的版本都可能受影响。Oracle已经将其定义为Bug(6981155),并在10.2.0.5和11g中解决。

    --- Fuyuncat Mark ---

Top

Copyright ©2005,HelloDBA.Com 保留一切权利

申明
by fuyuncat