首页 > 数据库 > Oracle > 使用Tkprof分析ORACLE跟踪文件
TKPROF 命令语法:
TKPROF
filename1
Filename2
SORT
PRINT
AGGREGATE
INSERT
SYS
TABLE
EXPLAIN
其中比较有用的一个排序选项是fchela,即按照elapsed time fetching来对分析的结果排序(记住要设置初始化参数timed_statistics=true),生成的文件将把最消耗时间的sql放在最前面显示。另外一个有用的参数就是sys,这个参数设置为no可以阻止所有以sys用户执行的sql被显示出来,这样可以减少分析出来的文件的复杂度,便于查看。
首先解释输出文件中列的含义:
CALL:每次SQL语句的处理都分成三个部分
Parse:这步将SQL语句转换成执行计划,包括检查是否有正确的授权和所需要用到的表、列以及其他引用到的对象是否存在。
Execute:这步是真正的由Oracle来执行语句。对于insert、update、delete操作,这步会修改数据,对于select操作,这步就只是确定选择的记录。
Fetch:返回查询语句中所获得的记录,这步只有select语句会被执行。
COUNT:这个语句被parse、execute、fetch的次数。
CPU:这个语句对于所有的parse、execute、fetch所消耗的cpu的时间,以秒为单位。
ELAPSED:这个语句所有消耗在parse、execute、fetch的总的时间。
DISK:从磁盘上的数据文件中物理读取的块的数量。一般来说更想知道的是正在从缓存中读取的数据而不是从磁盘上读取的数据。
QUERY:在一致性读模式下,所有parse、execute、fetch所获得的buffer的数量。一致性模式的buffer是用于给一个长时间运行的事务提供一个一致性读的快照,缓存实际上在头部存储了状态。
CURRENT:在current模式下所获得的buffer的数量。一般在current模式下执行insert、update、delete操作都会获取buffer。在current模式下如果在高速缓存区发现有新的缓存足够给当前的事务使用,则这些buffer都会被读入了缓存区中。
ROWS: 所有SQL语句返回的记录数目,但是不包括子查询中返回的记录数目。对于select语句,返回记录是在fetch这步,对于insert、update、delete操作,返回记录则是在execute这步。
1、设置TIMED_STATISTICS为True,可以在会话级别,也可以在实例级别。
会话级:
SQL> alter session set timed_statistics=True;
实例级:
SQL> alter system set timed_statistics=True scope=both;
2、 设置SQL_TRACE,可以在会话级,也可以在数据库级。
会话级:
SQL> alter session set sql_trace=true;
或者:
SQL>EXEC DBMS_SYSTEM.SET_SQL_TRACE_IN_SESSION(SID,SERIAL#,TRUE);
实例级:
SQL> alter system set sql_trace=true scope=both;
下面两个例子说明一下具体的用法:
1)
SQL> conn gdsbdw/gdsbdw@dss;
已连接。
--启用SQL_TRACE
SQL> alter session set sql_trace=true;
会话已更改。
SQL> select count(*) from jf2;
----------
SQL> select count(*) from jf22 where aab301 like '4401%';
----------
--启用timed_statistics
SQL> alter session set timed_statistics=true;
会话已更改。
SQL> select count(*) from jf2;
----------
--关闭SQL_TRACE
SQL> alter session set sql_trace =false;
会话已更改。
--查询此会话产生的TRACE文件
SQL> select username,sid,serial# from v$session where username='GDSBDW';
USERNAME
------------------------------ ---------- ----------
GDSBDW
SQL> select 'dss_ora_'||spid||'.trc' from v$process where addr = (select paddr f
rom v$session where sid=37);
'DSS_ORA_'||SPID||'.TRC'
------------------------
dss_ora_2432.trc
--使用tkprof分析trace文件
E:Documents and SettingsAdministrator>tkprof E:oracleadmindssudumpdss_ora
_2432.trc e:dss_ora_2432.trc.txt aggregate=yes sys=no waits=yes sort=fchela
--tkprocf输出了以下文件:e:dss_ora_2432.trc.txt
*******************************************************************************
count
cpu
elapsed
disk
query
current
rows
*******************************************************************************
select count(*) from jf2
call
------- ------
Parse
Execute
Fetch
------- ------
total
Misses in library cache during parse: 0
Optimizer goal: CHOOSE
Parsing user id: 63
Rows
-------
*******************************************************************************
select count(*) from jf22 where aab301 like '4401%'
call
------- ------
Parse
Execute
Fetch
------- ------
total
Misses in library cache during parse: 1
Optimizer goal: CHOOSE
Parsing user id: 63
Rows
-------
7584848
*******************************************************************************
OVERALL TOTALS FOR ALL NON-RECURSIVE STATEMENTS
call
------- ------
Parse
Execute
Fetch
------- ------
total
Misses in library cache during parse: 3
OVERALL TOTALS FOR ALL RECURSIVE STATEMENTS
call
------- ------
Parse
Execute
Fetch
------- ------
total
Misses in library cache during parse: 0
*******************************************************************************
Trace file: E:oracleadmindssudumpdss_ora_2432.trc
Trace file compatibility: 9.02.00
Sort options: fchela
--解释输出的文件
第2个语句:select count(*) from jf22 where aab301 like '4401%'
分析1次;执行1次;取数2行;总CPU是24.42秒;处理用去62.50秒;从磁盘读19012数据块;从SGA中得到19012(19012+0) ;返回1行。表使用了索引AAB301_INDX。
2)分析其它会话的例子(转载):
先从os上利用top命令找到当前占用cpu资源最高的一个进程的PID号:14483
然后在数据库中根据PID号找到相应的sid号和serial#:
SQL> select s.sid,s.serial# from v$session s,v$process p
---------- ----------
使用dbms_system.set_sql_trace_in_session包来对这个session进行trace:
SQL> exec DBMS_SYSTEM.SET_SQL_TRACE_IN_SESSION(101,25695,true);
PL/SQL procedure successfully completed.
到user_dump_dest定义的路径下查找刚刚最近生成的trace文件,可以根据时间来排序,找最近的trace文件,也可以根据SID_ORA_SPID.TRC的规则,即ORCL_ORA_14483.TRC找到TRACE文件。接着使用tkprof工具对此trace文件进行格式化分析,生成分析后的trace文件。
$tkprof orcl_ora_14483.trc allan.txt explain=system/manager aggregate=yes sys=no waits=yes sort=fchela
TKPROF: Release 9.2.0.4.0 - Production on Sun Dec 5 22:27:28 2004
Copyright (c) 1982, 2002, Oracle Corporation.
这里生成的allan.txt文件就是我们最终得到的格式化后的trace文件了,然后打开这个文件进行分析。
最后总的统计:
OVERALL TOTALS FOR ALL RECURSIVE STATEMENTS
call
------- ------
Parse
Execute 13197
Fetch
------- ------
total
来自 “ ITPUB博客 ” ,链接:https://blog.itpub.net/21267700/viewspace-1033078/ ,如需转载,请注明出处,否则将追究法律责任。