oracle TKPROF 一般说明 1

2023年 8月 26日 26.9k 0

TKPROF_是命令行工具,它的主要作用是输入一个原始的跟踪文件并输出一个格式化后的文本文件。此工具还可以生成SQL脚本以在数据库中加载数据,尽管这个特性很少有人使用。

 

仅通过指定一个输入文件和输出文件可以执行最简单的分析。在下面的例子中,输入文件是_DBM11106_ora_6334.trc,输出文件是DBM11106_ora_6334.txt。

tkprof DBM11106_ora_6334.trc
DBM11106_ora_6334.txt

 

尽管默认的输出文件扩展名是prf,
我个人还是喜欢使用txt。 在我看来,使用扩展名可以让所有人明白文件类型,同时可以在任何操作系统中正确识别出来。

 

未附加其他参数的分析仅对非常小的跟踪文件有用。在大多数情况下,你需要指定多个参数来获得一个更好的输出文件。

 

 TKPROF参数

如果运行TKPROF时未附加参数,返回的就是完整的TKPROF参数列表,其中包含简短的描述。

 

每个参数的功能如下。

explain会使TKPROF为跟踪文件中的每个SQL语句生成执行计划。实现方式是通过执行EXPLAIN PLAN语句产生的结果。很显然,为了执行SQL语句,就必须连接数据库。因此,此参数用来指定用户名、密码和连接字符串。可供使用的格式是explain=user/password@connectstring和explain=user/password。

 

请注意,为了能够尽最大可能得到正确的执行计划,你应该使用与生成跟踪文件时相同的用户,并且确保所有查询优化器的初始化参数也与生成跟踪文件时相同。同时也要注意初始化参数会随着程序运行时或登录触发器而更改。最好的情况就是你能使用相同的用户,但无论如何,即使所有条件都满足,因为使用EXPLAINPLAN语句生成的执行计划不一定与真正的执行计划一致,所以不建议指定explain参数。如果指定了错误的用户名、密码或连接字符串,则会分析跟踪文件而不返回任何错误信息。反之,则会在输出文件的头部找到类似以下的错误信息:

error connecting to database using:
scott/lion

ORA-01017:invalid username/password; logon
denied

EXPLAIN PLAN option disabled.

 

table只可以和explain参数一起使用。它的作用实际上是指定哪张表使用EXPLAIN PLAN语句生成执行计划。通常可以不指定此参数,因为TKPROF会自动创建并删除一个名为prof$plantable的计划表用做分析。总之,如果用户无法创建表(比如没有CREATE TABLE权限),就必须指定table参数。例如,要指定system用户下的表plan_table,那么参数必须设置成table=system.plan_table。执行分析的用户必须对特定的表具有SELECT、INSERT和DELETE权限。同样,错误也只会记录在输出文件里。

 

print用来限制输出文件里SQL语句的条数。默认情况下没有限制。这个参数只有与参数sort一起使用才有意义,用来输出top
SQL语句。例如,为了只获得10条SQL语句,参数必须设置成print=10。

 

aggregate指定TKPROF该如何处理相同的SQL语句。默认情况下(aggregate=yes),所有指定SQL语句的信息都会进行汇总。11.2版本中又进一步要求执行计划也要相同才可以。因此,在11.2版本中,默认会汇总对应SQL语句的每条执行计划信息。汇总信息会独立于跟踪文件里的SQL语句,因此就汇总来说,信息会缺少一部分。即使在许多情况下默认设置可以满足分析,但有时最好设置aggregate=no来检查单独的SQL语句。

 

TKPROF使用参数insert生成可以存储进数据库的SQL脚本。脚本名直接用参数自身指定,比如insert=load.sql。

 

sys参数指定由sys用户执行的SQL语句(典型情况下,解析操作需要递归查询数据字典)是否要写入输出文件。默认值是yes,但大多数时候我更愿意设置成no来避免无用的信息写入输出文件。你通常无法控制sys用户递归执行SQL语句,因此这是多余的。

 

TKPROF使用参数record生成跟踪文件里所有非递归语句的SQL脚本。脚本名称直接由参数指定(例如,record=replay.sql)。根据文档,这个特性可以用来手工重播SQL语句,但由于不会处理绑定变量,这通常无法实现。

 

waits确定是否将等待事件信息加入输出文件。默认情况下是加入的。就个人而言,输出文件里的等待事件非常重要,我认为不应该指定waits=no。

 

sort指定写入输出文件的SQL语句顺序。默认情况下,是根据在跟踪文件里的读取顺序排序的。基本上,你可以根据资源利用(比如调用数、CPU时间和物理读)或响应时间(即运行时间)来对输出进行排序。

 

如你所见,对于大多数选项(比如运行时间),每种类型的数据库调用的值都可用来排序:比如,解析游标所花费的时间prsela,执行游标所花费的时间exeela,以及从一个游标里获取数据所花费的时间fchela。尽管你可以根据多种选择和组合来进行排序,但对研究性能问题来说只有一种排序是真正有用的:response time。因此,你应该指定sort=prsela,exeela,fchela。

 

TKPROF支持在参数中传入多个值,只需要用逗号分隔即可,甚至可以传入不同单位的值。请注意,当跟踪文件里包含多个会话并且指定了参数aggregate=no,就会分别对每个会话的SQL语句进行排序。

 

基于以上信息,我个人常用的TKPROF
参数如下:

tkprof {input trace file} {output file}
sys=no sort=prsela,exeela,fchela

 

相关文章

pt-kill工具的使用
pt-ioprofile工具包的使用
数据库管理-第216期 Oracle的高可用-01(20240703)
DBMS_REPAIR EXAMPLE SCRIPT WITH PARTITION
数据库事务的四大特性: ACID 
使用BBED修复损坏的SYSTEM文件头

发布评论