百度360必应搜狗淘宝本站头条
当前位置:网站首页 > 优雅编程 > 正文

oracle优化工具:通过TKPROF来查看trace文件

sinye56 2024-10-10 11:11 6 浏览 0 评论

概述

分享一个工作中比较多用来分析跟踪文件的一个工具,还是挺好用的。TKPROF 是一个用于分析 Oracle 跟踪文件并且产生一个更加清晰合理的输出结果的可执行工具。如果一个系统的执行效率比较低,一个比较好的方法是跟踪用户的会话并且使用 TKPROF 工具的排序功能格式化输出,从而找出有问题的 SQL 语句。


语法格式

格式: tkprof tracefile outputfile [explain= ] [table= ] [print= ] [insert= ] [sys= ] [sort= ]

参数详解:

table=schema.tablename Use 'schema.tablename' with 'explain=' option. 
explain=user/password Connect to ORACLE and issue EXPLAIN PLAN. 
print=integer List only the first 'integer' SQL statements. 
aggregate=yes|no 
insert=filename List SQL statements and data inside INSERT statements. 
sys=no TKPROF does not list SQL statements run as user SYS. 
record=filename Record non-recursive statements found in the trace file. 
waits=yes|no Record summary for any wait events found in the trace file. 
sort=option Set of zero or more of the following sort options: 
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、

这里比较有用的一个排序选项是 fchela,即按照 elapsed time fetching 来对分析的结果排序(记住要设置初始化参数 TIME_STATISTICS=true),生成的.prf 文件将把最消耗时间的SQL 放在最前面显示。另外一个有用的参数就是 SYS,这个参数设置为 no 可以阻止所有以 SYS 用户执行的SQL 被显示出来。


TKPROF 工具的使用步骤

用这个工具之前要先产生trace文件,根据自己平时优化的过程整理如下,也做个备忘(因为自己平时不会去记命令啥的,只会去记大概的一个思路)

1、在数据库级别上设置 TIMED_STATISTICS 为 true:

alter system set timed_statistics=false scope=both; (这样就可以不用重启生效了)

2、得到想要查看 session 的 trace

如果需要在 session 级别上设置 trace,可以在 SQL*Plus 中使用下列语句:

SQL> alter session set sql_trace=true;

3、对 trace 文件使用 TKPROF 工具进行分析

tkprof tracefile outfile [explain=user/password] [options...]

一般来说,使用 TKPROF 得到的输出文件中包含 3 个部分。

1)SQL 语句本身。 
2)相关的诊断信息,包括 CPU 时间、总共消耗的时间、读取磁盘数量、逻辑读的数量、以及查询中返回的记录数目等。 
3)列出这个语句的执行计划。

Tkprof命令输出的解释

call count cpu elapsed disk query current rows 
------- ------ -------- ---------- ---------- ---------- ---------- 
Parse 12 3.02 6.04 0 101 0 0 
Execute 12 0.00 0.03 0 0 0 0 
Fetch 12 6.41 5.47 88 143290 0 10 
------- ------ -------- ---------- ---------- ---------- ---------- 
total 36 9.43 11.55 88 143391 0 10 
Misses in library cache during parse: 11 
Optimizer goal: CHOOSE 
Parsing user id: 43 (TEST) 
Rows Row Source Operation 
------- --------------------------------------------------- 
 0 SORT ORDER BY (cr=445 r=1 w=0 time=18059 us) 
 0 COUNT STOPKEY (cr=445 r=1 w=0 time=17987 us) 
 0 TABLE ACCESS FULL ERROREVENT (cr=445 r=1 w=0 time=17983 us) 
 0 SELECT STATEMENT GOAL: CHOOSE 
 0 SORT (ORDER BY) 
 0 COUNT (STOPKEY) 
 0 TABLE ACCESS (FULL) OF 'ERROREVENT' 

这里解释下输出文件中列的含义:

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


总结:

简单说下自己平时数据库卡时找问题的过程:一般先从 OS 上利用 top 命令找到当前占用 CPU 资源最高的一个进程的 PID 号,然后在数据库中根据 PID 号找到相应的 SID 号和 SERIAL#,接下来用 dbms_system.set_sql_trace_in_session 包来对这个 session 进行 trace(这里也可以按上面方法产生),最后TKPROF 工具分析下刚刚产生的trace文件基本就可以知道问题出在哪了。

后面会分享更多关于DBA和devops方面的内容,感兴趣的朋友可以关注下!!

相关推荐

Linux基础知识之修改root用户密码

现象:Linux修改密码出现:Authenticationtokenmanipulationerror。故障解决办法:进入单用户,执行pwconv,再执行passwdroot。...

Linux如何修改远程访问端口

对于Linux服务器而言,其默认的远程访问端口为22。但是,出于安全方面的考虑,一般都会修改该端口。下面我来简答介绍一下如何修改Linux服务器默认的远程访问端口。对于默认端口而言,其相关的配置位于/...

如何批量更改文件的权限

如果你发觉一个目录结构下的大量文件权限(读、写、可执行)很乱时,可以执行以下两个命令批量修正:批量修改文件夹的权限chmod755-Rdir_name批量修改文件的权限finddir_nam...

CentOS「linux」学习笔记10:修改文件和目录权限

?linux基础操作:主要介绍了修改文件和目录的权限及chown和chgrp高级用法6.chmod修改权限1:字母方式[修改文件或目录的权限]u代表所属者,g代表所属组,o代表其他组的用户,a代表所有...

Linux下更改串口的权限

问题描述我在Ubuntu中使用ArduinoIDE,并且遇到串口问题。它过去一直有效,但由于可能不必要的原因,我觉得有必要将一些文件的所有权从root所有权更改为我的用户所有权。...

Linux chown命令:修改文件和目录的所有者和所属组

chown命令,可以认为是"changeowner"的缩写,主要用于修改文件(或目录)的所有者,除此之外,这个命令也可以修改文件(或目录)的所属组。当只需要修改所有者时,可使用...

chmod修改文件夹及子目录权限的方法

chmod修改文件夹及子目录权限的方法打开终端进入你需要修改的目录然后执行下面这条命令chmod777*-R全部子目录及文件权限改为777查看linux文件的权限:ls-l文件名称查看li...

Android 修改隐藏设置项权限

在Android系统中,修改某些隐藏设置项或权限通常涉及到系统级别的操作,尤其是针对非标准的、未在常规用户界面显示的高级选项。这些隐藏设置往往与隐私保护、安全相关的特殊功能有关,或者涉及开发者选项、权...

完蛋了!我不小心把Linux所有的文件权限修改了!在线等修复!

最近一个客户在群里说他一不小心把某台业务服务器的根目录权限给改了,本来想修改当前目录,结果执行成了根目录。...

linux改变安全性设置-改变所属关系

CentOS7.3学习笔记总结(五十八)-改变安全性设置-改变所属关系在以前的文章里,我介绍过linux文件权限,感兴趣的朋友可以关注我,阅读一下这篇文章。这里我们不在做过的介绍,注重介绍改变文件或者...

Python基础到实战一飞冲天(一)--linux基础(七)修改权限chmod

#07_Python基础到实战一飞冲天(一)--linux基础(七)--修改权限chmod-root-groupadd-groupdel-chgrp-username-passwd...

linux更改用户权限为root权限方法大全

背景在使用linux系统时,经常会遇到需要修改用户权限为root权限。通过修改用户所属群组groupid为root,此操作只能使普通用户实现享有部分root权限,普通用户仍不能像root用户一样享有超...

怎么用ip命令在linux中添加路由表项?

在Linux中添加路由表项,可以使用ip命令的route子命令。添加路由表项的基本语法如下:sudoiprouteadd<network>via<gateway>这...

Linux配置网络

1、网卡名配置相关文件回到顶部网卡名命名规则文件:/etc/udev/rules.d/70-persistent-net.rules#PCIdevice0x8086:0x100f(e1000)...

Linux系列---网络配置文件

1.网卡配置文件在/etc/sysconfig/network-scripts/下:[root@oldboynetwork-scripts]#ls/etc/sysconfig/network-s...

取消回复欢迎 发表评论: