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_moNAME 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/
,如需转载,请注明出处,否则将追究法律责任。