tkprof是Oracle自带的一个命令行工具,主要作用是将原始的跟踪文件转换为格式化的文本文件,最简单的使用方式如下:
tkprof ly_ora_128636.trc ly_ora_128636.txt
tkprof带有很多参数,在多数情况下,使用这些参数对你的分析将很有帮助。
tkprof参数
如果不带任何参数运行tkprof,它将打印出完整的参数列表,并带有简单的描述。下面是对参数的说明:
explain
为每个SQL语句提供一个执行计划。该参数需要指定用户、密码,也可以指定数据库连接串,如:explain=user/[email protected]_string或者explain=user/password。
table
纸盒explain参数一起使用,用于指定生成执行计划使用的表,通常不需要指定,只有当用户不能创建表时才需要(如缺少create table权限)。
用于限制输出文件生成的SQL语句的数量,例如:print=10.
aggregate
指定是否单独处理同样内容的SQL语句,默认不单独处理。指定为aggregate=no,看单独的每个SQL语句。
insert
生成SQL脚本,SQL脚本可以用来存储信息到数据库中,SQL脚本的名字由参数指定,如:insert=load.sql。
sys
指定sys用户运行的SQL语句是否也写入到输出文件中,默认yes。
record
生成SQL脚本,里面包含在trace文件中找到的所有非递归语句,脚本名通过参数本身来指定,例如:record=replay.sql。
waits
是否添加等待事件的信息,默认添加。
sort
指定写入输出文件中的SQL语句的顺序。默认是trace文件中发现的SQL顺序。
下面是一个例子:
tkprof {input trace file} {output file} sys=no sort=prsela,exeela,fchela
prsela:第一个游标解析耗费的时间
exeela:针对游标执行花费的时间
fchela:游标获取数据行所花费的时间
tkprof输出
输出文件带有一个头,其中有对参数的说明,如下:
********************************************************************** count = number of times OCI procedure was executed cpu = cpu time in seconds executing elapsed = elapsed time in seconds executing disk = number of physical reads of buffers from disk query = number of buffers gotten for consistent read current = number of buffers gotten in current mode (usually for update) rows = number of rows processed by the fetch or execute call **********************************************************************
count:执行的数据库调用次数
cpu:处理数据调用花去的CPU时间,以秒为单位
elapsed:处理数据库调用花费的总的时间,以秒为单位
disk:物理读的数据块数量,如果大于逻辑读的数量(disk>query+current),表示使用了临时表空间。
query:在一致性模式下从高速缓存逻辑读取的快数量,用作查询。
current:在当前模式下从高速缓存逻辑读取的块数量,用于insert、delete、merge以及update等操作。
rows:处理的数据行数量。查询表示获取的行数量,而insert、delete、merge以及update等则表示影响的行数量。
下面看一个具体的例子:
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 501 0.03 0.15 0 1465 0 50001 ------- ------ -------- ---------- ---------- ---------- ---------- ---------- total 503 0.03 0.15 0 1465 0 50001
上面分别对应了parse、execute和fetch这3个阶段,在fetch阶段执行了501次fetch,获取了50001行数据,每次fetch获取100行数据。
接下来是:
Misses in library cache during parse: 1 Misses in library cache during execute: 1 Optimizer mode: ALL_ROWS Parsing user id: 5
前两行表示发生在解析和执行调用阶段的硬解析数量,如果没有硬解析,则不存在。
“Optimizer mode”表示优化器模式。
“Parsing user id”是解析SQL语句的用户。
在这之后可以看到执行计划,这里只做一个简单讲解:
Rows Row Source Operation ------- --------------------------------------------------- 50001 COUNT STOPKEY (cr=1465 pr=0 pw=0 time=300125 us) 50001 VIEW (cr=1465 pr=0 pw=0 time=200088 us) 50001 INDEX FULL SCAN IDX_HISTORYALARM$CLEAR (cr=1465 pr=0 pw=0 time=100049 us)(object id 53743)
cr:一致性模式下逻辑读出的数据块数
pr:从磁盘物理读出的数据块数
pw:物理写入磁盘的数据块数
time:以微妙表示的总的耗费时间,注意数据不精确
cost:操作的评估开销(仅11g才提供)
size:操作返回的预估计数据量(字节数)(仅11g才提供)
card:操作返回的预估计行数(仅11g才提供)
接下来就是等待事件:
Event waited on Times Waited Max. Wait Total Waited ---------------------------------------------------------------------------------- SQL*Net message to client 502 0.00 0.00 SQL*Net message from client 502 0.08 15.42 SQL*Net more data to client 500 0.00 0.01
Times Waited:等待时间占用时间
Max. Wait:单个等待事件最大等待时间,单位为秒
Total Waited:针对一个等待事件总的等待秒数,不精确
这里你可以看到执行中遇到的等待事件,通过对这些等待事件的分析,有助于你了解在等待什么样的资源,查询的瓶颈,有针对的做出优化。可以在Oracle Database Reference手册的附录中找到关于多数常见等待事件的简短描述。
Oracle性能分析3:TKPROF介绍