首页  >  文章  >  数据库  >  Oracle 10g 10053事件

Oracle 10g 10053事件

WBOY
WBOY原创
2016-06-07 17:11:24949浏览

你是否想知道一句sql语句如何执行,它是否走索引,是否采用不同得驱动表,是否用nestloop join,hash joinhellip;..?这一切对你是

10053事件
    你是否想知道一句sql语句如何执行,它是否走索引,是否采用不同得驱动表,是否用nestloop join,hash join…..?这一切对你是否很神秘呢?或许你会说 execution plan 能看到这些东西,但是你是否清楚 execution plan 是如何得到?这篇文章就是给出了隐藏在 execution plan 底下的具体实现。 幸运的是,现在我们有了这样一种方法,它能10046事件一样,一步一步地将CBO做出的执行计划的整个过程演示给我们看。这个方法就是10053事件,让我们能够直接窥视这里

究竟发生了什么,10053事件依然无法再Oracle官方文档上找到任何关于它的信息。


    现在让我们来演示如何生成一个 10053 事件的跟踪文件
        
SQL>创建表 t as select rownum x from dba_objects;

已创建表。

SQL>;在 t(x) 上创建索引 ind_t;

SQL>; exec dbms_stats.gather_table_stats(user,'t1',cascade=>true);

PL/SQL 过程成功完成。

SQL>;创建表 t1 as select x,'T1' name from t where x
已创建表。

SQL>;在 t1(x) 上创建索引 ind_t1;

SQL>; exec dbms_stats.gather_table_stats(user,'t1',cascade=>true);

SQL>;更改会话设置tracefile_identifier='jscntest53_1';    

SQL> alter session set events '10053 跟踪名称上下文永远,级别 1' ;

会话已更改。

SQL>解释 select t1.* from t,t1 where t.x
已解释。

SQL>; alter session set events '10053 trace name context off';

会话已更改。

10053事件的使用方法和10046一样,首先给事件一个级别,然后运行sql(或者直接使用
在/oracle/ora10/admin/jscn/udump目录我们看到比较特殊的一个trace文件jscn_ora_20033_jscntest53_1.trc,这就是我们要分析的trace文件

看看让我一起来这些内容,10053时间不能tkprof,可以通过该名使trac文件加亮。
[oracle@GD-TEST-84 udump]$ cp jscn_ora_20124_jscntest53_2.trc jscn_ora_20124_jscntest53_2.sql
第一部分
/oracle/ora10/admin/jscn/udump/jscn_ora_20124_jscntest53_2.trc
Oracle Database 10g 企业版版本 10.2.0.4.0 - 64 位生产
具有分区、OLAP、数据挖掘和真实应用程序测试选项
。。。。。。。。。。。。。。
谓词移动(PM)

这一部分是trace文件通用的,包含了网络、数据库和会话的信息,这里不再累述了。

Predicate Move-Around (PM) 这个开始,,进入了10053的trace信息部分,这部分CBO主要工作是对SQL语句谓词进行分析、重写,把它改写为最符合逻辑的SQL,比如我们最初的谓语
形式(通俗讲就是刚开始自己​​写的where条件):
" T"."X"被oracle改成
"T"."X"
谓词移动 (PM)
************ **************
PM:考虑 SEL$1 中的谓词移动 (#0)。
PM:   检查 SEL$1 中的谓词移动的有效性 (#0)。 0).
PM:     PM 绕过:外部查询不包含视图。
FPD:考虑 SEL$1 (#0) 中的简单过滤器推送
FPD:   SEL$1 (#0) 中的当前 where 子句谓词:
         "T"."X"
kkogcp:尝试从 SEL 的检查约束生成传递谓词$1 (#0)
带有检查约束的谓词: "T"."X"传递谓词生成后: "T"."X"最后: "T"."X"
FPD:   继及物谓词在 SEL$1 (#0) 中生成:
         "T1"."X"apadrv-start: call(in-use=1064, alloc=16344),compile(in-use= 35272, alloc=36536)
kkoqbc-start
            : 调用(in-use=1072, alloc=16344), 编译(in-use=36488, alloc=36536)
kkoqbc-subheap (创建 addr =0x2b297cb0c000)
************************************************
本次会话的当前 SQL 语句:
解释 select t1.* from t,t1 where t.x************* 的计划******************************

很容易看出,从逻辑上看两个谓词是等价的,CBO把它改成这样子,主要是为了更方便计算每一步的成本并提示基数(基数),比如我们在这条
sql语句中要既访问t1表中的x实例,要访问那么列,CBO就可以按照这个条件提示没搞操作的结果集(Cardinglity)。
接下来:
******************************************** **
图例
优化器跟踪使用以下缩写。
CBQT - 基于成本的查询转换
JPPD - 连接谓词下推
FPD - 过滤器下推
PM - 谓词移动
CVM - 复杂视图合并
SPJ - 选择项目连接
SJC - 设置连接转换
SU - 子查询取消嵌套
OBYE - 通过消除排序
ST - 星形变换
qb - 查询块
LB - 叶块
DK - 不同键
LB/K - 每个键的平均叶块数
DB/K - 平均数据数每个键的块数
CLUF - 聚类因子
NDV - 不同值的数量
Resp - 响应成本
卡片 - 基数
Resc - 资源成本
NL - 嵌套循环(连接)
SM - 排序合并(联接)
HA - 哈希(联接)
CPUCSPEED - CPU 速度
IOTFRSPEED - I/O 传输速度
IOSEEKTIM - I/O 寻道时间
SREADTIM -平均单块读取时间
MREADTIM - 平均多块读取时间
MBRC - 平均多块读取次数
MAXTHR - 最大I/O 系统吞吐量
SLAVETHR - 平均从属I/O 吞吐量
dmeth -分配方式
  1:无需分区
  2:值分区
  4:右随机(循环)
  512:左随机(循环)
  8:右广播和左分区
  16:左广播和右分区
  32:使用右分区
  64:使用左分区
  128:使用散列分区维度
256:使用范围分区维度
  2048:使用列表分区维度
  1024:串行运行连接
  0:无效的分配方法
sel - 选择性
ptn - 分区

************************************************

Oracle 10g 10053事件

声明:
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn