ITPub博客

首页 > 数据库 > Oracle > 10046【十一】

10046【十一】

原创 Oracle 作者:哎呀我的天呐 时间:2015-03-05 11:13:12 0 删除 编辑

alter session set events '10046 trace name context forever, level 12';

alter table test_move move tablespace users online;

alter session set events '10046 trace name context off';

select TRACEFILE from v$process where addr = (select paddr from v$session where sid = (select sid from v$mystat where rownum = 1));


非当前会话抓起10046 tracefile

SELECT TRACEFILE ,SPID FROM v$process WHERE ADDR IN (select paddr from v$session where username = 'DM' and  MODULE ='dw.sapBWD_DVEBMGS00@hqbwadev01 (TNS V1-V3)');

--other session exec

oradebug setospid 23456

oradebug event 10046 trace name context forever,level 12

oradebug event 10046 trace name context off

oradebug tracefile_name


----------------------分割线-------------------------


tkprof 10046test . trc 10046test . txt sys = no

下面是trc中一个sql

us 单位是微秒 ,217084是0.2s, 到了hash group by 用了1200s。但是这个返给 hash group by 的行数只有2071行,如果当时pga特别紧张,那么做hash table可能通过临时表,但是IO即便再慢也不会用到1200s的时间,除非说IO出了问题,如果是IO的问题,那么一定会有等待,但是这里并没有。再看上边的总结hash group by发生在fetch阶段,一共fetch1071次,也是1071行,说明一次fetch一行,一共花了才7.62s。 那么hash group by的时间到底花费到哪里了呢?在tkprof中似乎找不到原因,我们去看裸文件。复制sql id 到裸文件中去找sql id

parse之后你会得到一个临时的cursor number 

然后我们找 fetch #18446741324872605848


再往后就很快了,这里就不截图了

    C 比较重要的指标,代表本步操作消耗的CPU 时间片; 9i以后单位为microsecond 都s

    E Elapsed Time ,代表本步操作消耗的自然时间, 9i以后单位为microsecond
    P 物理读的数目
    CR 一致性读引起的buffer get 数目,cr过高说明正在更新的dml频繁。
    CU 当前读current read引起的buffer get数目
    mis =0 该指标说明library cache未发生miss,则本次解析 我们没有需要硬解析 而是采用软解析或者更好的方式。 硬解析在Oracle中成本是很高的。 注意由于在任何阶段包括PARSE/EXECUTE/FETCH阶段都可能发生游标被age out的现象,所以在这些阶段都会打印mis指标。如果mis>0则说明可能发生了硬解析。
    r 处理的行数
    DEP =0 代表该SQL的递归深入(recursive depth),因为递归SQL可能再引发下一层的递归SQL, 如果DEP=0则说明不是递归SQL,如果DEP>0则说明是递归SQL。
    比如说一个plsql,plsql的入口文本 p1这个path是0、就是用户直接调用的那个入口,里面的sql是1,比如这个sql里面再用到函数,那么就是2。
    plh plan的hash value。上边的例子一看就是个plsql,因为如果是sql的话,只可能=0。
    og 标示优化器的模式

      • 0 游标不可见 或 优化器环境未合理创建

      • 1 – ALL_ROWS

      • 2 - FIRST_ROWS

      • 3 – RULE

      • 4 – CHOOSE


    tim linux的时间戳,timestamp 一个时间戳, 在9i之前 这个指标的单位是 1/100 s 即 10ms 。 到9i以后单位为 1/1000000 的microsecond 。 这个时间戳可以用来判断 trace中2个点的时间差。 这个 TIm的值来自于V$TIMER视图,这个视图是Oracle内部计时用的。



这里的一个fetch 相当于awr中user call,用户去做一个操作的入口函数,比如你fetch的时候,oracle内部会调用很多函数、调用操作系统函数,最后把数据捞出来,但是用户只需要看到fetch接口就好了,c就表示我这一个动作到把数据拿出来,花的cpu时间。


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

上一篇: 【八】查询变换
请登录后发表评论 登录
全部评论
https://cloud.tencent.com/developer/inventory/14362

注册时间:2014-10-30

  • 博文量
    403
  • 访问量
    2528705