如何读懂tkprof

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这步。 

A、query+current/rows 平均每行所需的block数,太大的话(超过20)SQL语句效率太低 
B、Parse count/Execute count parse count应尽量接近1,如果太高的话,SQL会进行不必要的reparse 
C、rows Fetch/Fetch Fetch Array的大小,太小的话就没有充分利用批量Fetch的功能,增加了数据在客户端和服务器之间的往返次数。 
D、disk/query+current 磁盘IO所占逻辑IO的比例,太大的话有可能是db_buffer_size过小(也跟SQL的具体特性有关) 
E、elapsed/cpu 太大表示执行过程中花费了大量的时间等待某种资源 
F、cpu Or elapsed 太大表示执行时间过长,或消耗了了大量的CPU时间,应该考虑优化 
G、执行计划中的Rows 表示在该处理阶段所访问的行数,要尽量减少  
Tkprof工具可用来格式化sql trace产生的文件,让你更容易看懂trace的内容 


用法: 

tkprof tracefile outputfile [explain= ] [table= ] [print= ] [insert= ] [sys= ] [sort= ] ... 


参数说明: 

tracefile:你要分析的trace文件 
outputfile:格式化后的文件 
explain=user/password@connectstring 
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:设置排序选项,选项如下: 
prscnt:number of times parse was called 
prscpu:cpu time parsing 
prsela:elapsed time parsing 
prsdsk:number of disk reads during parse 
prsqry:number of buffers for consistent read during parse 
prscu:number of buffers for current read during parse 
prsmis:number of misses in library cache during parse 
execnt:number of execute was called 
execpu:cpu time spent executing 
exeela:elapsed time executing 
exedsk:number of disk reads during execute 
exeqry:number of buffers for consistent read during execute 
execu:number of buffers for current read during execute 
exerow:number of rows processed during execute 
exemis:number of library cache misses during execute 
fchcnt:number of times fetch was called 
fchcpu:cpu time spent fetching 
fchela:elapsed time fetching 
fchdsk:number of disk reads during fetch 
fchqry:number of buffers for consistent read during fetch 
fchcu:number of buffers for current read during fetch 
fchrow:number of rows fetched 
userid:userid of user that parsed the cursor 
可根据自己的需要设置排序 


举例: 

1.列出前2条sql语句的执行情况: 

tkprof c:\oc_ora_2892.trc c:\cc.txt print=2 

2.将数据保存到数据库: 

tkprof c:\oc_ora_2892.trc c:\cc.txt insert=c:\insert.sql 

执行后会在c:\产生insert.sql文件,执行该文件即可将数据保存到数据库,以下为insert.sql部分内容: 

REM Edit and/or remove the following CREATE TABLE 
REM statement as your needs dictate. 
CREATE TABLE tkprof_table 
date_of_insert DATE 
,cursor_num NUMBER 
,depth NUMBER 
,user_id NUMBER 
,parse_cnt NUMBER 
,parse_cpu NUMBER 
,parse_elap NUMBER 
,parse_disk NUMBER 
,parse_query NUMBER 
,parse_current NUMBER 
,parse_miss NUMBER 
,exe_count NUMBER 
,exe_cpu NUMBER 
,exe_elap NUMBER 
,exe_disk NUMBER 
,exe_query NUMBER 
,exe_current NUMBER 
,exe_miss NUMBER 
,exe_rows NUMBER 
,fetch_count NUMBER 
,fetch_cpu NUMBER 
,fetch_elap NUMBER 
,fetch_disk NUMBER 
,fetch_query NUMBER 
,fetch_current NUMBER 
,fetch_rows NUMBER 
,ticks NUMBER 
,sql_statement LONG 
); 
INSERT INTO tkprof_table VALUES 
SYSDATE, 1, 0, 61, 1, 0, 418, 0, 0, 0, 1 
, 1, 15625, 1435, 0, 0, 0, 0, 0 
, 4, 0, 4417, 0, 24, 0, 36, 13450151 
, ’select * from tblinventoryhistory 
‘); 

3.提取sql执行语句: 

C:\>tkprof c:\oc_ora_2892.trc c:\cc.txt record=sqlstr.sql 

sqlstr.sql中的内容: 

alter session set sql_trace=true ; 
alter session set events '10046 trace name context forever,level 12'; 
select * from tblinventoryhistory ; 
select * from tblorder ; 
select * from tblproduct ; 
select * from tbluser ; 
select * from tblroute ; 

4.产生执行计划: 

C:\>tkprof c:\oc_ora_2892.trc c:\ff.txt explain=ocuser/ocuser table=ocuser.test1 

在产生的ff.txt文件中会体现其执行计划: 

Rows Execution Plan 
——- ————————————————— 
0 SELECT STATEMENT GOAL: CHOOSE 
0 TABLE ACCESS (FULL) OF 'TBLROUTE' 
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值