ITPub博客

首页 > Linux操作系统 > Linux操作系统 > 怎么不用索引了? 小谈10053 event

怎么不用索引了? 小谈10053 event

原创 Linux操作系统 作者:wqhhust 时间:2008-03-09 15:01:39 0 删除 编辑
10053 event 对于性能调优是一个很好的辅助工具。它产生的trace文件提供了oracle如何选择执行计划,为何如此这般得到执行计划的信息。有时对于一个sql语句,很明显oracle应该使用索引,但是执行计划却没有使用索引。这时10053事件可以提供一些帮助。

首先请注意,10053只对CBO有效,而且如果一个sql语句已经解析过,就不会产生新的trace信息。

下面来看例子
create table test as select * from dba_objects;
CREATE INDEX TEST.TEST_RI ON TEST.TEST (OBJECT_NAME) REVERSE;
在这里创建了一个reverse索引

本来是想测试下面文章中的“reverse索引优化诸于 like '%TEST‘的sql语句”,所以使用了reverse索引。用或不用reverse不影响测试结果。
http://www.orafaq.com/node/1918


SQL> conn test/test
已连接。
SQL>  alter session set events='10053 trace name context forever, level 1';

会话已更改。

SQL> select * from test where object_name = 'TEST';

OWNER
------------------------------
OBJECT_NAME
-------------------------------------------------------------------------------

SUBOBJECT_NAME                  OBJECT_ID DATA_OBJECT_ID OBJECT_TYPE
------------------------------ ---------- -------------- ------------------
CREATED    LAST_DDL_T TIMESTAMP           STATUS  T G S
---------- ---------- ------------------- ------- - - -
TEST
TEST
                                    30317          30317 TABLE
09-3月 -08 09-3月 -08 2008-03-09:13:23:43 VALID   N N N

打开trace文件,发现里面只有如下信息:
*** 2008-03-09 14:52:03.343
QUERY
select * from test where object_name = 'TEST'

为什么没有关于oracle如何选择执行计划的信息呢?前面讲过,如果sql已经解析过,或者是基于RBO的,就不会产生执行计划的信息。 这是第一次执行该sql,所以唯一的可能就是oracle使用RBO来解析该sql。
SQL> show parameter optimizer_mo

NAME                                 TYPE        VALUE
------------------------------------ ----------- ------------------------------
optimizer_mode                       string      CHOOSE

可以看到数据库用的是choose模式。在该模式下,如果table没有stats信息,就会使用RBO。那么现在就收集stats.

SQL> exec dbms_stats.gather_schema_stats('TEST');

PL/SQL 过程已成功完成。

再执行一下这个sql, 由于oracle已经解析过这个sql,所以需要稍稍修改这个sql,例如加一个空格,或者将某个大写变成小写,这样sql就和上次解析的sql不同了。这里将小写的where变为大写的WHERE。

SQL> select * from test WHERE object_name = 'TEST';

再打开trace文件,可以看到如下的信息。当然10053在这里没有直接告诉我们为什么没有使用index, 但间接的告诉我们其原因是没有stats(没有使用CBO)。


***************************************
SINGLE TABLE ACCESS PATH
Column: OBJECT_NAM  Col#: 2      Table: TEST   Alias: TEST
    NDV: 17927     NULLS: 0         DENS: 5.5782e-005
    NO HISTOGRAM: #BKT: 1 #VAL: 2
  TABLE: TEST     ORIG CDN: 29520  ROUNDED CDN: 2  CMPTD CDN: 2
  Access path: tsc  Resc:  40  Resp:  40
  Access path: index (equal)
      Index: TEST_RI
  TABLE: TEST
      RSC_CPU: 0   RSC_IO: 2
  IX_SEL:  0.0000e+000  TB_SEL:  5.5782e-005
  BEST_CST: 2.00  PATH: 4  Degree:  1
***************************************
OPTIMIZER STATISTICS AND COMPUTATIONS
***************************************
GENERAL PLANS
***********************
Join order[1]:  TEST[TEST]#0
Best so far: TABLE#: 0  CST:          2  CDN:          2  BYTES:        184
Final - All Rows Plan:
  JOIN ORDER: 1
  CST: 2  CDN: 2  RSC: 2  RSP: 2  BYTES: 184
  IO-RSC: 2  IO-RSP: 2  CPU-RSC: 0  CPU-RSP: 0
QUERY
select * from test WHERE object_name = 'TEST'

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

上一篇: oracle blog
请登录后发表评论 登录
全部评论

注册时间:2008-03-09

  • 博文量
    9
  • 访问量
    15810