您的位置:首页 > 其它

tkprof命令格式化分析跟踪文件

2013-12-30 21:51 531 查看
trace文件(*.trc格式)对开发者来说是不可读的格式,需要把跟踪文件转换为为可读的格式,tkprof命令用是把跟踪文件格式的工具。

1、tkprof基本语法:

tkprof  trace_file  output_file
[waits=yes|no] [sys=yes|no] [sort=(sort keys)]...

tkprof的关键参数如下:

tracefile:跟踪工具生成的原始跟踪文件(*.trc),即要格式的跟踪文件.

outputfile:跟踪内容格式化后要写入的文件。可以格式化为*.TXT、*.DOC等格式。

explain=user/password@connectstring(如果需要生成执行计划,需要这项,默认是没有执行计划的,

只有Row Source Operation)

table=schema.tablename

注1:这两个参数是一起使用的,通过连接数据库对在trace文件中出现的每条sql语句查看执行计划,并

将之输出到outputfile中

注2:该table必须是数据库中不存在的,如果存在会报错

print=n:只列出最初N个sql执行语句

insert=filename:会产生一个sql文件,运行此文件可将收集到的数据insert到数据库表中

sys=no:过滤掉由sys执行的语句

record=filename:可将非嵌套执行的sql语句过滤到指定的文件中去

waits=yes|no:是否统计任何等待事件

aggregate=yes|no:是否将相同sql语句的执行信息合计起来,默认为yes

sort=option:设置排序选项,排序包含两部分:第一部分为将要被排序调用的类型,第二部分是为将要排序

的值。排序选项就是有第一部分和第二部分组成,比如exedsk,其中exe是第一部分,dsk是第二部分的

内容,意思是将按照执行调用时耗费磁盘读取操作来排序。下表展示tkprof排序选项两个组成部分:

第一部分描述第二部分描述
prs根据解析调用期间的值进行排序cnt根据调用次数排序
exe根据执行调用期间的值进行排序(等价于为查询语句打开游标)cpu根据CPU时间消耗排序
fch根据提取调用期间的值进行排序(只针对查询语句)ela根据时间消耗排序
dsk根据磁盘读取次数排序
qry根据一致读次数排序
cu根据当前读次数排序
mis根据库缓存未命中次数排序
row根据处理的记录数排序

2、使用举例

假如D:\oracle\diag\rdbms\david\orcl\trace目录下一个名为orcl_ora_7684_MIMI.trc的跟踪文件,格式化后
输出文件名为orcl_output.txt文件,那么在DOS环境下执行tkprof命令如下图所示:



打开orcl_output.txt格式化文件,有如下内容:
SQL ID: 518m7y4zt6xkp
Plan Hash: 1947974170
select *
from
t_student where gid = 1

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

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

Rows     Row Source Operation
-------  ---------------------------------------------------
1  TABLE ACCESS BY INDEX ROWID T_STUDENT (cr=2 pr=2 pw=0 time=0 us cost=1 size=19 card=1)
1   INDEX UNIQUE SCAN SYS_C0010947 (cr=1 pr=1 pw=0 time=0 us cost=0 size=0 card=1)(object id 73110)

Elapsed times include waiting on following events:
Event waited on                             Times   Max. Wait  Total Waited
----------------------------------------   Waited  ----------  ------------
SQL*Net message to client                       2        0.00          0.00
SQL*Net message from client                     2        0.04          0.04
Disk file operations I/O                        1        0.00          0.00
db file sequential read                         2        0.01          0.01


3、格式化后跟踪文件内容解释

本部分以这2部分的格式化文件的内容为例,解读格式化后的跟踪文件的内容。
1. 第3行到5行内容:展示SQL文本,即被跟踪的SQL语句。
2. 第8行到14行一些标识含义。

count:每个类型调用的次数。

cpu:cpu处理时间(单位:秒)。
elapsed:所需总时间消耗,包括cpu时间、等待时间等(单位:秒)。
disk:执行物理I/O次数,从磁盘上的数据文件中物理读取的块的数量。
query:查询(一致性)模式下缓存读的数量,查询模式读取的块通常由一致读去的查询产生。
current:当前模式下缓存读的数量。

在调优SQL语句时,query和current的区分不重要,因此,可以把他们加在一起成为“逻辑读”。

rows:处理的记录数。
3. oracle调用的三种类型
Parse(解析):这一步会先检查SQL语句的语法、语义、对象的有效性与权限,接着由优化器确定这条语句的执行计划。
Execute(执行):SQL语句在这一步执行。对于insert、update、delete操作,这步会修改数据,对于select操
作,这步就只是确定选择的记录。如果查询语句使用FOR UPDATE或者执行排序操作,系统会在这一步就检索出所有的语句。
Fetch(提取):查询语句从这里返回记录。

4、比较中主要的比率

Query + Current = Logical Reads (total number of buffers accessed)

(total query+total current)/total rows
平均每行所需的block数,太大的话(超过20)SQL语句效率太低

Parse count/Execute count parse count应尽量接近1,如果太高的话,SQL会进行不必要的reparse

rows Fetch/count Fetch的大小,太小的话就没有充分利用批量Fetch的功能,增加了数据在客户端和服务器之间的往返次数。

disk/(query+current) 磁盘IO所占逻辑IO的比例,太大的话有可能是db_buffer_size过小(也跟SQL的具体特性有关)

elapsed/cpu 太大表示执行过程中花费了大量的时间等待某种资源

cpu Or elapsed 太大表示执行时间过长,或消耗了了大量的CPU时间,应该考虑优化

执行计划中的Rows 表示在该处理阶段所访问的行数,要尽量减少

DISK是从磁盘上的数据文件中物理读取的块的数量。一般来说更想知道的是正在从缓存中读取的数据而不是从磁盘上读取的数据。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: