一、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博客 ” ,链接:https://blog.itpub.net/17012874/viewspace-693781/ ,如需转载,请注明出处,否则将追究法律责任。