oracle exist 10053,oracle 10053事件

一. 10053事件

当一个SQL出现性能问题的时候,可以使用SQL_TRACE 或者 10046事件来跟踪SQL. 通过生成的trace来了解SQL的执行过程。 我们在查看一条SQL的执行计划的时候,只能看到CBO 最终告诉我们的执行计划结果,但是不知道CBO 是根据什么来做的。 如果遇到了执行计划失真,如:一个SQL语句,很明显oracle应该使用索引,但是执行计划却没有使用索引。无法进行分析判断。

而10053事件就提供了这样的功能。它产生的trace文件提供了Oracle如何选择执行计划,为什么会得到这样的执行计划信息。

10053事件生成trace文件目录和SQL_TRACE一样。

在Oracle 10g中,SQL_TRACE生成的trace文件默认路劲是$ORACLE_BASE/admin/SID/udump.

在Oracle 11g,trace 默认路径在:$ORACLE_BASE/diag/rdbms/orcl/orcl/trace目录下

对于10053事件的trace文件,我们只能直接阅读原始的trace文件,不能使用tkprof工具来处理,tkprof工具只能用来处理sql_trace 和 10046事件产生的trace文件。

10053事件有两个级别:

Level 2:2级是1级的一个子集,它包含以下内容:

Column statistics

Single Access Paths

Join Costs

Table Joins Considered

Join Methods Considered (NL/MS/HA)

Level 1: 1级比2级更详细,它包含2级的所有内容,在加如下内容:

Parameters used by the optimizer

Index statistics

1.1启用10053事件:

cdec0645add3fc3c328197dda5c76203.png ALTER SESSION SET EVENTS='10053 trace name context forever, level 1';

ALTER SESSION SET EVENTS='10053 trace name context forever, level 2';启用10053事件

1.2关闭10053事件:

cdec0645add3fc3c328197dda5c76203.png

ALTER SESSION SET EVENTS '10053 trace name context off';

关闭10053事件

说明:

(1)sqlplus中打开autotrace看到的执行计划实际上是用explain plan 命令得到的,explain plan 命令不会进行bind peeking。应该通过v$sql_plan查看SQL的真实的执行计划。

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

二. 实验10053事件:

1.设定当前的trace 文件

1.1 设定trace 文件名称

cdec0645add3fc3c328197dda5c76203.png

SQL> alter session set tracefile_identifier='10053事件';

会话已更改。

设定Trace文件名称

设置标识的目的就是方便我们查找生成的trace文件。我们只需要在trace目录查找文件名里带有标识的文件即可。

1.2直接用如下SQL直接查出,当前的trace文件名。

cdec0645add3fc3c328197dda5c76203.png

SELECTd.VALUE|| '/' || LOWER (RTRIM (i.INSTANCE, CHR (0)))|| '_ora_' ||p.spid|| '.trc' AS"trace_file_name"

FROM (SELECTp.spidFROMv$mystat m, v$session s, v$process pWHERE m.statistic# = 1 AND s.SID = m.SID AND p.addr =s.paddr) p,

(SELECTt.INSTANCEFROMv$thread t, v$parameter vWHERE v.NAME = 'thread' AND (v.VALUE = 0 OR t.thread# =TO_NUMBER (v.VALUE))) i,

(SELECTVALUEFROMv$parameterWHERE NAME = 'user_dump_dest') d;

查看TRACE文件位置

2.启动10053事件

cdec0645add3fc3c328197dda5c76203.png

SQL> ALTER SESSION SET EVENTS='10053 trace name context forever, level 1';

启动10053事件

3.执行事务

cdec0645add3fc3c328197dda5c76203.png

SQL> select * frompub_user u, pub_department deptwhere u.department_id =dept.department_id;

SQL>Explain plan for select * frompub_user u, pub_department deptwhere u.department_id = dept.department_id;

执行SQL

4.关闭10053事件

cdec0645add3fc3c328197dda5c76203.png

SQL> ALTER SESSION SET EVENTS '10053 trace name context off';

关闭10053事件

三. 查看生成的trace文件

在此之前设置了标识,所以直接进入trace目录,找到含有 ‘10053事件’标识的trace 文件。

Trace file D:\oracle\product\10.2.0\admin\dw\udump/10053事件.trc

四、10053事件内容解析

1.  Predicate Move-Around (PM)(对SQL语句的谓词进行分析、重写,把它改为最符合逻辑的SQL语句)

2.  解释trace文件用到的一些缩写的指标定义

3.  Peeked values of the binds in SQL statement(绑定变量的描述)

4.  Bug Fix Control Environment(一些修复的bug信息)

5.  PARAMETERS WITH DEFAULT VALUES(性能相关的初始化参数)

6.  BASE STATISTICAL INFORMATION(SQL引用对象的基本信息)

7.  CBO计算每个对象单独访问的代价

8.  CBO计算列出两个表关联方式,并计算出每一种关联方式的代价,最终选择最小的cost

五、实验:10053事件的妙用

在我们写sql时,一条明显可以查询出来数据的语句,为什么我们写完之后却不返回数据?这时,10053可以解答我们的疑问。

见如下order by 查不出数据实验:

cdec0645add3fc3c328197dda5c76203.png

---10.2.0.1版本加了order by查不出数据实验

Drop tabletest1 purge;

Drop tabletest2 purge;

create table test1 (id number(20),name varchar2(20));

insert into test1 values (1,'A');

insert into test1 values (2,'A');

insert into test1 values (3,'A');

insert into test1 values (4,'A');

insert into test1 values (5,'B');

insert into test1 values (6,'B');

insert into test1 values (7,'C');

insert into test1 values (8,'C');

insert into test1 values (9,'C');

insert into test1 values (10,'C');

create table test2 (id number(20),name varchar2(20));

insert into test2 values (1,'A');

insert into test2 values (2,'A');

insert into test2 values (3,'A');

insert into test2 values (4,'A');

insert into test2 values (5,'A');

insert into test2 values (6,'A');

insert into test2 values (7,'A');

insert into test2 values (8,'B');

insert into test2 values (9,'C');

insert into test2 values (10,'C');

SELECT * FROM (SELECT *

FROM

(SELECT INNER_TABLE.*, ROWNUM OUTER_TABLE_ROWNUM

FROM (select test2.* fromtest2,

(SELECTt.id, t.nameFROMtest1 T

WHERE T.id = (SELECT MAX(T1.id)FROMtest1 T1WHERE T.name =T1.name)) test1

where test2.name =test1.nameorder bytest2.name---加上order by就没有数据 ) INNER_TABLE)

WHERE OUTER_TABLE_ROWNUM <= 18) OUTER_TABLEWHERE OUTER_TABLE_ROWNUM > 0;

根据10053Trace 文件修改SQL如下

SELECT *

FROM (SELECT *

FROM (SELECT INNER_TABLE.*, ROWNUM OUTER_TABLE_ROWNUM

FROM (select test2.*

from test2,

(SELECT t.id, t.name

FROM test T

WHERE T.id in (SELECT MAX(T1.id)

FROM test T1

group by name)) test1

where test2.name = test1.name

order by test2.name) INNER_TABLE)

WHERE OUTER_TABLE_ROWNUM <= 18) OUTER_TABLE

WHERE OUTER_TABLE_ROWNUM > 0;

本文摘自:http://www.cnblogs.com/HondaHsu/p/3533411.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值