ITPub博客

首页 > Linux操作系统 > Linux操作系统 > SQL_trace and 10046事件

SQL_trace and 10046事件

原创 Linux操作系统 作者:hjianping 时间:2011-04-26 19:25:31 0 删除 编辑

一、SQL_TRACE
1、启动并生成SQL TRACE
SQL> grant alter session to scott;
SQL> alter system flush shared_pool;
SQL> set timing on

SQL> alter session set tracefile_identifier='mytest';
SQL> alter session set sql_trace=true;

SQL> select * from scott.t where id=1000;

SQL> alter session set sql_trace=false;

2、使用tkprof工具处理trace文件
$ cd $ORACLE_BASE/admin/sid/udump/
$ tkprof *_mytest.trc mytest.txt
$ cat mytest.txt
********************************************************************************
select *
from
 t where id=200

call     count       cpu    elapsed       disk      query    current        rows
------- ------  -------- ---------- ---------- ---------- ----------  ----------
Parse        1      0.00       0.00          0          0          0           0
Execute      1      0.00       0.00          0          0          0           0
Fetch        2      0.00       0.00          1          4          0           1
------- ------  -------- ---------- ---------- ---------- ----------  ----------
total        4      0.00       0.00          1          4          0           1

Misses in library cache during parse: 1
Optimizer mode: ALL_ROWS
Parsing user id: 54 

Rows     Row Source Operation
-------  ---------------------------------------------------
      1  TABLE ACCESS BY INDEX ROWID T (cr=4 pr=1 pw=0 time=801 us)
      1   INDEX RANGE SCAN IND_T (cr=3 pr=1 pw=0 time=779 us)(object id 51677)
********************************************************************************

Parse:分析,SQL的分析阶段
Execute:执行,SQL的执行阶段
Fetch:数据提取,数据的提取阶段

count:计数器,表示当前的操作执行了多少次
cpu:当前操作消耗CPU的时间(秒)
elapsed:当前的操作一共用时多少(秒,包括CPU事件和等待时间)
disk:当前操作的物理读(物理I/O次数)
query:当前操作的一致性读取的数据块数(查询使用的方式)
current:当前操作的current的方式读取的数据块数(修改数据使用的方式)
rows:当前操作处理的数据记录数

SQL语句实际执行过程中消耗的资源信息

Rows:当前操作实际返回的记录数
Row Source Operation:行源操作
cr:consistent read,一致性方式读取的数据块
pr:physical read,物理读取的数据块
pw:物理写
time:当前操作消耗的时间

3、跟踪其他用户的session,首先要获得sid和serial#
SQL> select a.sid,a.serial#,a.username,b.pid,b.spid
from v$session a,v$process b
where a.paddr=b.addr
and a.username = 'SCOTT';

启动跟踪
execute dbms_system.set_sql_trace_in_session(sid,serial#,true);

停止跟踪
execute dbms_system.set_sql_trace_in_session(sid,serial#,false);


二、tkprof工具
$ tkprof tracefile outputfile [explain=username/password] [sys=yes/no] [aggragate=yes/no]
$ tkprof *_mytest.trc mytest.txt

explain=username/password 生成该SQL语句的执行计划
sys=yes/no   是否生成该SQL语句引发的递归SQL
aggragate=yes/no  是否合并所有相同的SQL,默认为合并


三、10046事件
10046事件是Oracle的一个内部事件,是对SQL_TRACE功能的增强,用于跟踪会话的详细信息。它可以设置四个级别:
1  --等同于sql_trace
4  --Level 1 + 绑定值(bind values),但绑定变量的值只能在原始的trace文件中获取
8  --Level 1 + 等待事件跟踪
12 --等同于Level 4 + Level 8

10046事件可以在全局设置,也可以在session级别设置,一般在生产环境很少使用全局设置,因为会占用资源,而且会生成很大的跟踪文件。在会话级别,既可以跟踪当前的session,也可以跟踪其他用户的session。

1、跟踪当前会话的示例如下:

启动跟踪
SQL> alter session set events '10046 trace name context forever';
SQL> alter session set events '10046 trace name context forever, level 4';

停止跟踪
SQL> alter session set events '10046 trace name context off';


2、跟踪其他用户的session,首先要获得sid和serial#
SQL> select a.sid,a.serial#,a.username,b.pid,b.spid
from v$session a,v$process b
where a.paddr=b.addr
and a.username = 'SCOTT';

启动跟踪
SQL> exec dbms_monitor.session_trace_enable(sid,serial#,waits=>true,binds=>true);
or
SQL> exec dbms_system.set_ev(sid,serial#,10046,12,'');

停止跟踪
SQL> exec dbms_monitor.session_trace_disable(sid,serial#);
or
SQL> exec dbms_system.set_ev(sid,serial#,10046,0,'')

查看user_dump_dest目录下生成的跟踪文件

 

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

下一篇: 批量绑定
请登录后发表评论 登录
全部评论

注册时间:2011-04-24

  • 博文量
    80
  • 访问量
    72832