OracleTT.Com - 搜集互联网免费Oracle教程,免费Oracle视频教程,起步从这里开始!

Oracle数据库学习_Oracle书籍下载_MySQL书籍下载_Oracle免费视频教程 - OracleTT.Com

当前位置: 主页 > 性能诊断 >

Oracle诊断工具-tkprof

时间:2011-11-01 01:37来源:网络 作者:admin 点击:
tkprof工具可用来格式化sql trace产生的文件,让你更容易看懂trace的内容 用法: tkprof tracefile outputfile [explain= ] [table= ] [print= ] [insert= ] [sys= ] [sort= ] ... 参数说明: tracefile: 你要分析的t

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必须是数据库中不存在的,如果存在会报错
     explain=user/password执行explain命令将结果放在SQL trace的输出文件中  
     table=schema.table指定tkprof处理sql trace文件时临时表的模式名和表名  
     insert=scriptfile创建一个文件名为scriptfile的文件,包含了tkprof存放的输出sql语句  
     sys=[yes/no]确定系统是否列出由sys用户产生或重调的sql语句  
     print=number将仅生成排序后的第一条sql语句的输出结果  
     record=recordfile这个选项创建一个名为recorderfile的文件,包含了所有重调用的sql语句
     waits=yes|no:是否统计任何等待事件
     aggregate=yes|no:是否将相同sql语句的执行信息合计起来,默认为yes
     sort=sort_option按照指定的方法对sql trace的输出文件进行降序排序  
        sort_option 选项  
           prscnt  按解析次数排序  
           prscpu  按解析所花cpu时间排序  
           prsela  按解析所经历的时间排序  
           prsdsk  按解析时物理的读操作的次数排序  
           prsqry  按解析时以一致模式读取数据块的次数排序  
           prscu   按解析时以当前读取数据块的次数进行排序  
           execnt  按执行次数排序  
           execpu  按执行时花的cpu时间排序  
           exeela  按执行所经历的时间排序  
           exedsk  按执行时物理读操作的次数排序  
           exeqry  按执行时以一致模式读取数据块的次数排序  
           execu   按执行时以当前模式读取数据块的次数排序  
           exerow  按执行时处理的记录的次数进行排序  
           exemis  按执行时库缓冲区的错误排序  
           fchcnt  按返回数据的次数进行排序  
           fchcpu  按返回数据cpu所花时间排序  
           fchela  按返回数据所经历的时间排序  
           fchdsk  按返回数据时的物理读操作的次数排序  
           fchqry  按返回数据时一致模式读取数据块的次数排序  
           fchcu   按返回数据时当前模式读取数据块的次数排序  
           fchrow  按返回数据时处理的数据数量排序

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

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

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

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

 执行后会在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'

小技巧:
1.如何查找你产生的trace文件:

SQL> select d.value || '\' || lower(rtrim(i.instance, chr(0))) || '_ora_' ||
  2         p.spid || '.trc' trace_file_name
  3    from (select p.spid
  4            from sys.v$mystat m, sys.v$session s, sys.v$process p
  5           where m.statistic# = 1
  6             and s.sid = m.sid
  7             and p.addr = s.paddr) p,
  8         (select t.instance
  9            from sys.v$thread t, sys.v$parameter v
10           where v.name = 'thread'
11             and (v.value = 0 or t.thread# = to_number(v.value))) i,
12         (select value from sys.v$parameter where name = 'user_dump_dest') d;
 
TRACE_FILE_NAME
——————————————————————————–
/opt/oracle/admin/hsjf/udump/hsjf_ora_1026.trc

 2.sort选项可同时用多个,做法是用括号括起来,中间用逗号分割:

C:\>tkprof c:\oc_ora_2892.trc c:\cc.txt sort=(prsela, exeela, fchela)

注意:最后排序是按照各个选项的数字之和进行排序,类似于order by (sort1+sort2+sort3),而不是order by sort1,sort2,sort3

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 表示在该处理阶段所访问的行数,要尽量减少

EG:

alter session set max_dump_file_size=unlimited;
alter session set timed_statistics=true;
alter session set events '10046 trace name context forever, level 12';
select 'Hello, world; today is '||sysdate from dual; exit;
 
tkprof card_ora_13226.trc trace.txt print=100 record=sql.txt sys=no

然后查询trace.txt就是分析内容了。
(责任编辑:OracleTT)
顶一下
(0)
0%
踩一下
(0)
0%
------分隔线----------------------------
发表评论
请自觉遵守互联网相关的政策法规,严禁发布色情、暴力、反动的言论。
评价:
表情:
用户名: 验证码:点击我更换图片