首页 > 代码库 > sql跟踪及tkprof使用

sql跟踪及tkprof使用

简述

在oracle数据库中,awr是关于数据库系统整体的负载情况和运行情况的报告。而当系统负载都显示正常,而客户端执行某些动作响应很慢,或者某些终端连接的会话执行缓慢或异常时,就需要用到会话级别的跟踪了。

常见方法概述

Session级别跟踪的方法有许多,比如当前会话的跟踪,可以执行命令

Alter session set sql_trace=true;

Alter session set sql_trace=false;

或者使用10046事件

Alter session set events ‘10046 trace name context forever,level 12’;

Alter session set events ‘10046 trace name context off’

其中level 12是可选级别。

Level 1是指标准的sql跟踪,与设置sql_trace效果相同。

Level 4是指在标准的基础上增加绑定变量信息。

Level 8是指在标准的基础上增加等待事件信息。

Level 12是指在标准的基础上同时增加绑定变量信息和等待事件信息。

以上例子是在session级别进行跟踪,若环境中需要在整个实例级别进行跟踪,则直接将以上命令中的session更改为system即可实现。但系统级别的跟踪将消耗大量的系统资源,因此,若非性能诊断需要,不要开启在系统级别的sql_trace。

我们要用的方法

方法有很多,会用一种就行,下面我们说下我推荐的一种方法。

首先,可以设置trace文件标志,使我们的trace文件更容易找出来。

Alter session set tracefile_identifier=’wjf’;

之后打开计时

Alter system set timed_statistics=true;

然后查找到要跟踪会话的sid与serial#,

Select sid,serial#,osuser,machine from v$session;

找到sid与serial#后,就可以执行跟踪了,比如sid=22,serial#=22;

执行以下命令

Exec dbms_monitor.session_trace_enable(22,22,waits=>true,binds=>true);

Exec dbms_monitor.session_trace_disable(22,22);

其中waits=>true跟binds=>true想必也不用解释了。

追踪文件处理(tkprof)

追踪后的trc文件可以在DIAGNOSTIC_DEST目录下找到,但是直接追踪产生的trc文件可读性并不好,需要借助一个oracle提供的工具处理以下,这个工具就是tkprof。

例如我们此处生成trc文件名称为orcl_ora_1234_wjf.trc.

则我们需要在系统级别,即退出sqlplus,在shell或cmd下执行以下命令

Shell>tkprof d:/app/administrator/diag/rdbms/orcl/orcl/trace/orcl_ora_1234_wjf.trcd:/wjf_2222.txt

这样就能生成可读性较强的追踪文件进行分析了。Tkprof工具必须输入的两个参数也就是一个输入文件,一个输出文件而已。

但tkprof还有一些其他参数,很多时候需要利用其他参数来生成文件,从而更方便找出问题。

Tkprof工具的标准语法

tkprof filename1filename2 [waits=yes|no] [sort=option] [print=n]

    [aggregate=yes|no] [insert=filename3] [sys=yes|no] [table=schema.table]

    [explain=user/password] [record=filename4] [width=n]

Tkprof参数介绍

介绍几个自我感觉比较常用的参数

Waits=yes|no:是否包含等待事件信息。

Print=n:设置显示多少行sql。比如你设置了排序信息,可以只查看top 10的sql,就可以设置print=10了。

Sys=yes|no:设置是否包含sys用户所发布的sql。主要是为了启动或禁止显示用户为执行自己的sql所产生的递归sql,默认为yes。

Sort=option:设置生成sql根据指定选项进行排序。

prscnt  number oftimes parse was called

 prscpu  cpu timeparsing

  prsela  elapsedtime parsing

  prsdsk  numberof disk reads during parse

  prsqry  numberof buffers for consistent read during parse

   prscu   numberof buffers for current read during parse

   prsmis  numberof misses in library cache during parse

 

    execnt  numberof execute was called

    execpu  cputime spent executing

    exeela  elapsedtime executing

    exedsk  numberof disk reads during execute

    exeqry  numberof buffers for consistent read during execute

    execu   numberof buffers for current read during execute

    exerow  numberof rows processed during execute

    exemis  numberof library cache misses during execute

 

    fchcnt  numberof times fetch was called

    fchcpu  cputime spent fetching

    fchela  elapsedtime fetching

    fchdsk  numberof disk reads during fetch

    fchqry  numberof buffers for consistent read during fetch

    fchcu   numberof buffers for current read during fetch

    fchrow  numberof rows fetched

    userid  useridof user that parsed the cursor

其他还有一些参数,具体可以查看联机文档中的performance tunning guide。

Tkprof举例

所以,一个比较正常的tkprof语句可能是这个样子的

tkprof d:/app/administrator/diag/rdbms/orcl/orcl/trace/orcl_ora_1234_wjf.trcd:/wjf_2222.txt waits=no  sys=no  sort=(prscpu,execpu,fchcpu) print=10;

就这样了,就像生成awr报告一样,生成文件永远是最简单的,能把生成的报告读的多透彻才是见功底的东西。在此,我仅仅把生成报告的过程做个记录,至于怎么读,慢慢再说。

 

sql跟踪及tkprof使用