Tkprof是一个用于分析Oracle跟踪文件而且产生一个更加清晰合理的输出结果的可执行工具。若是一个系统的执行效率比较低,一个比较好的方法是经过跟踪用户的会话而且使用Tkprof工具使用排序功能格式化输出,从而找出有问题的SQL语句。sql
一. TKPROF 命令语法:数据库
TKPROF filename1, filename2 [ SORT = [opion][,option] ]缓存
[ PRINT = integer ]session
[AGGREGATE = [ YES | NO ] ]ide
[INSERT = filename3 ]工具
[SYS = [ YES | NO ] ]fetch
[ [ TABLE = schema.table ] | [EXPLAIN = user/password ] ]spa
[ RECORD = filename ]对象
相关说明:排序
filename1 指定的输入文件,能够是多个文件联起来。
Filename2 格式化输出文件。
SORT 在输出到输出文件前,先进程排序。若是省去,则按照实际使用的顺序输出到文件中。排序选项有如下多种:
prscnt number of times parse was called
prscpu cpu time parsing
prsela elapsed time parsing
prsdsk number of disk readsduring parse
prsqry number of buffers forconsistent read during parse
prscu number of buffers forcurrent read during parse
prsmis number of misses inlibrary cache during parse
execnt number of execute wascalled
execpu cpu time spent executing
exeela elapsed time executing
exedsk number of disk readsduring execute
exeqry number of buffers forconsistent read during execute
execu number of buffers forcurrent read during execute
exerow number of rows processedduring execute
exemis number of library cachemisses during execute
fchcnt number of times fetch wascalled
fchcpu cpu time spent fetching
fchela elapsed time fetching
fchdsk number of disk readsduring fetch
fchqry number of buffers forconsistent read during fetch
fchcu number of buffers forcurrent read during fetch
fchrow number of rows fetched
userid userid of user that parsedthe cursor
PRINT 只列出输出文件的第一个integer 的SQL语句。默认为全部的SQL语句。
AGGREGATE 若是= NO ,则不对多个相同的SQL进行汇总。
INSERT SQL 语句的一种,用于将跟踪文件的统计信息存储到数据库中。在TKPROF建立脚本后,在将结果输入到数据库中。
SYS 禁止或启用将SYS用户所发布的SQL语句列表到输出文件中。
TABLE 在输出到输出文件前,用于存放临时表的用户名和表名。
EXPLAIN 对每条SQL 语句肯定其执行规划。并将执行规划写到输出文件中。
其中比较有用的一个排序选项是fchela,即按照elapsed time fetching来对分析的结果排序(记住要设置初始化参数timed_statistics=true),生成的文件将把最消耗时间的sql放在最前面显示。另一个有用的参数就是sys,这个参数设置为no能够阻止全部以sys用户执行的sql被显示出来,这样能够减小分析出来的文件的复杂度,便于查看。
二. 对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这步。
三. Tkprof的使用步骤基本上遵循如下几步:
1、设置TIMED_STATISTICS为True,能够在会话级别,也能够在实例级别。
会话级:
SQL> alter session settimed_statistics=True;
实例级:
SQL> alter system settimed_statistics=True scope=both;
2、 设置SQL_TRACE,能够在会话级,也能够在数据库级。
会话级:
SQL> alter session set sql_trace=true;
实例级:
SQL> alter system set sql_trace=truescope=both;