SQL性能的度量 - 会话级别的SQL跟踪sql_trace

通过初始化参数sql_trace开启会话跟踪,通过oradebug命令输出到跟踪文件,提供更加详细的信息。但一般还需要借助tkprof工具格式化跟踪文件便于阅读。


在使用sql_trace之前,有两个初始化参数可能需要注意一下,不过从9i开始都是默认按以下设置的。


初始化参数timed_statistics最好设为true,否则一些重要信息不会被收集

show parameter timed_statistics;


NAME                                 TYPE        VALUE

------------------------------------ ----------- ------------------------------

timed_statistics                     boolean     TRUE


对跟踪文件的大小限制,可以KBMB为单位设置,或者干脆设置为unlimited

show parameter max_dump_file_size;


NAME                                 TYPE        VALUE

------------------------------------ ----------- ------------------------------

max_dump_file_size                   string      UNLIMITED


启用自己的会话跟踪

alter session set sql_trace = true;

exec dbms_session.set_sql_trace(true);


跟踪指定的会话

exec dbms_system.set_sql_trace_in_session(sid, serial#, true|false);


如果要对其它用户的会话进行设置,可以用dbms_system的另外两个过程

exec dbms_system.set_bool_param_in_session(sid, serial#, 'timed_statistics', true);

exec dbms_system.set_int_param_in_session(sid, serial#, 'max_dump_file_size', 2147483647);


生成自己会话的跟踪文件

oradebug setmypid;

oradebug tracefile_name;


生成指定会话的跟踪文件

oradebug setospid ;

oradebug tracefile_name;


跟踪文件的命名规则:_ora_.trc,其中sid是实例名,spid是会话对应的操作系统服务器进程ID


跟踪文件的路径由初始化参数user_dump_dest指定

show parameter user_dump_dest;


NAME                                 TYPE        VALUE

------------------------------------ ----------- ----------------------------------------

user_dump_dest                       string      c:\oracle\diag\rdbms\mes\mes\trace


以下查询可以找到会话的sidserial#pidspid几个参数

select s.username, s.sid, s.serial#, p.pid, p.spid from v$session s, v$process p where s.paddr = p.addr and s.username is not null;


执行一些操作后关闭跟踪,观察跟踪文件的内容。跟踪文件的内容比较专业,不宜看懂,可以通过操作系统命令行工具tkprof格式化跟踪文件

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


主要参数含义:

sys:yesno,默认yes,指定输出文件中是否包含以SYS用户运行的sql语句。

record:指定一个路径下的文件,用来生成在跟踪文件中找到的所有非递归的SQL。如:record=d:\test.log。

aggregate:noyes,默认no,指定tkprof是否将同样文本内容的sql聚合处理,如执行了十次select * from a,如果指定这个参数为no,那么产生的输出文件会有十个这样语句的执行信息,如果指定的是yes,那么tkprof会把这十次的执行信息汇总显示。

sort:指定tkprof输出文件里sql语句按照什么排序,默认是按照执行的先后顺序排序的,可以指定它按照其他方式排序,比如磁盘读取数,CPU时间等。这个参数最经常用的方式是:sort=prsela,exeela,fchela,也就是按照解析、执行、提取,这三个值加起来就是响应时间,tkprof会根据三个值的和进行排序,即按照响应时间排序。

print:经常搭配sort参数一起使用,用来指定tkprof输出sql语句的数量。这两个参数搭配使用起来就比较妙,如想知道一个跟踪文件里响应时间排前十的SQL,那么你就可以sort=prsela,exeela,fchela print=10来搭配使用。

explain:为每一个SQL提供一个执行计划。使用方法是explain=用户名/密码。

wait:指定输出文件中是否包含等待事件,默认为包含。


如对于11g的跟踪路径

tkprof c:\oracle\diag\rdbms\mes\mes\trace\mes_ora_2372.trc d:\2372.txt sys=no sort=prsela,exeela,fchela record=d:\2372.log

而对于10g

tkprof c:\oracle\product\10.2.0\admin\mes\udump\mes_ora_3888.trc d:\3888.txt sys=no sort=prsela,exeela,fchela record=d:\3888.log


对于linux系统,在操作系统层面上利用top命令找到当前占用CPU资源最高的Oracle进程的ID号,然后根据该ID号找到相应会话的sidserial#

select s.username, s.sid, s.serial# from v$session s, v$process p where s.paddr = p.addr and p.spid = &spid;


有了sidserial#,就可以对会话实施SQL跟踪

exec dbms_system.set_sql_trace_in_session(sid, serial#, true);


最后通过tkprof工具转换跟踪文件输出,从而可以诊断分析该会话执行的操作。


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

来自 “ ITPUB博客 ” ,链接:http://blog.itpub.net/28974745/viewspace-2150343/,如需转载,请注明出处,否则将追究法律责任。

转载于:http://blog.itpub.net/28974745/viewspace-2150343/

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值