一. 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事件:

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事件:

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 文件名称

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

会话已更改。

设定Trace文件名称

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

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

SELECT      d.VALUE
|| '/'
|| LOWER (RTRIM (i.INSTANCE, CHR (0)))
|| '_ora_'
|| p.spid
|| '.trc'
AS "trace_file_name"
FROM (SELECT p.spid
FROM v$mystat m, v$session s, v$process p
WHERE m.statistic# = 1 AND s.SID = m.SID AND p.addr = s.paddr) p,
(SELECT t.INSTANCE
FROM v$thread t, v$parameter v
WHERE v.NAME = 'thread'
AND (v.VALUE = 0 OR t.thread# = TO_NUMBER (v.VALUE))) i,
(SELECT VALUE
FROM v$parameter
WHERE NAME = 'user_dump_dest') d;

查看TRACE文件位置

2.启动10053事件

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

启动10053事件

3.执行事务

SQL> select * from pub_user u, pub_department dept
where u.department_id = dept.department_id; SQL>Explain plan for select * from pub_user u, pub_department dept
where u.department_id = dept.department_id;

执行SQL

4.关闭10053事件

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 查不出数据实验:

---10.2.0.1版本加了order by查不出数据实验
Drop table test1 purge;
Drop table test2 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');

1.创建实验数据

SELECT *
FROM (SELECT *
FROM (SELECT INNER_TABLE.*, ROWNUM OUTER_TABLE_ROWNUM
FROM (select test2.*
from test2,
(SELECT t.id, t.name
FROM test1 T
WHERE T.id = (SELECT MAX(T1.id)
FROM test1 T1
WHERE T.name = T1.name)) test1
where test2.name = test1.name
order by test2.name
---加上order by就没有数据
) INNER_TABLE)
WHERE OUTER_TABLE_ROWNUM <= 18) OUTER_TABLE
WHERE OUTER_TABLE_ROWNUM > 0;

2.查询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;

根据10053Trace文件修改SQL

Oracle 课程八之性能优化之10053事件的更多相关文章

  1. Oracle 课程八之性能优化之10046事件

    Oracle 的事件很多. 具体参考blog: Oracle 跟踪事件 set event 转摘:http://blog.csdn.net/tianlesoftware/archive/2009/12 ...

  2. Oracle 课程八之性能优化之Oracle SQL Trace

    一. SQL_TRACE 当SQL语句出现性能问题时,我们可以用SQL_TRACE来跟踪SQL的执行情况,通过跟踪,我们可以了解一条SQL或者PL/SQL包的运行情况,SQL_TRACE命令会将SQL ...

  3. oracle SQL性能分析之10053事件

    优化器生成正确执行计划的前提条件是要有正确的统计信息,不准确的统计信息往往会导致错误的执行计划.当通过SQL和基数推断出的执行计划和实际执行计划不同时,就可以借助10053事件.10053事件是用来诊 ...

  4. Oracle 性能调优 10053事件

    思维导图 10053事件概述 我们在查看一条SQL语句的执行计划时,只看到了CBO最终告诉我们的执行计划结果,但是我们并不知道CBO为何要这样做. 特别是当执行计划明显失真时,我们特别想搞清楚为什么C ...

  5. Oracle 课程八之跟踪事件set event

    一.Oracle跟踪文件 Oracle跟踪文件分为三种类型: 一种是后台报警日志文件,记录数据库在启动.关闭和运行期间后台进程的活动情况,如表空间创建.回滚段创建.某些alter命令.日志切换.错误消 ...

  6. Oracle之SQL语句性能优化(34条优化方法)

    (1)选择最有效率的表名顺序(只在基于规则的优化器中有效): ORACLE的解析器按照从右到左的顺序处理FROM子句中的表名,FROM子句中写在最后的表(基础表 driving table)将被最先处 ...

  7. Oracle 11g 中SQL性能优化新特性之SQL性能分析器(SQLPA)

    Oracle11g中,真实应用测试选项(the Real Application Testing Option)提供了一个有用的特点,叫SQL性能分析器(SQL Performance Analyze ...

  8. Android官方开发文档Training系列课程中文版:性能优化建议

    原文地址:http://android.xsoftlab.net/training/articles/perf-tips.html 本篇文章主要介绍那些能够提升总体性能的微小优化点.它与那些能突然改观 ...

  9. oracle编程300例-性能优化(一)

    1.在SELECT语句中避免使用“*” 2.尽可能减小记录行数 3.使用rowid高效删除重复记录 实例: delete from stu s where s.rowid>(select min ...

随机推荐

  1. hdoj 2204 Eddy's爱好

    原文链接:http://www.cnblogs.com/DrunBee/archive/2012/09/05/2672546.html 题意:给你一个正整数N,确定在1到N之间有多少个可以表示成M^K ...

  2. java基础知识回顾之javaIO类--File类

    File类是对文件系统中文件以及目录(文件夹)进行封装的对象,可以通过面向对象的思想来操作文件和目录(文件夹).File类保存文件或目录的各种元素的信息,包括文件名,文件长度,最后修改日期,是否可读, ...

  3. IText 生成页脚页码

    做doc文档报表的时候可能遇到这样的需求: 每一个页面需要页码,用IText可以完成这样的需求. IText生成doc文档需要三个包:iTextAsian.jar,iText-rtf-2.1.4.ja ...

  4. Android中ContentProvider的简单使用

    1.新建继承ContentProvider的类 package com.wangzhu.demo; import android.content.ContentProvider; import and ...

  5. 李洪强iOS之Foundation框架—字符串

    Foundation框架—字符串 一.Foundation框架中一些常用的类 字符串型: NSString:不可变字符串 NSMutableString:可变字符串 集合型: 1) NSArray:O ...

  6. 删除元素 不存在 NO 存在 输出余下元素

    #include<stdio.h> #include<stdlib.h> #define N 5 #define NULL 0 #define OK 1 #define ERR ...

  7. Java多线程5:线程等待与唤醒

    原文:http://www.cnblogs.com/skywang12345/p/3479224.html wait(),notify(), notifyAll()等方法介绍在Object.java中 ...

  8. Java API —— 编码 & IO流( InputStreamReader & OutputStreamWriter & FileReader & FileWriter & BufferedReader & BufferedWriter )

    1.编码     1)编码表概述         由字符及其对应的数值组成的一张表     2)常见编码表         · ASCII/Unicode 字符集:ASCII是美国标准信息交换码,用一 ...

  9. Java API —— 泛型

    1.泛型概述及使用 JDK1.5以后出现的机制 泛型是一种特殊的类型,它把指定类型的工作推迟到客户端代码声明并实例化类或方法的时候进行.也被称为参数化类型,可以把类型当作参数一样传递过来,在传递过来之 ...

  10. Image.FrameDimensionsList 属性-----具体使用案例

    上一篇中说到了图片的具体产生以及属性,本篇主要是具体的使用,详情案例见下面的具体视图及代码 using System;using System.Collections.Generic;using Sy ...