您好,欢迎来到三六零分类信息网!老站,搜索引擎当天收录,欢迎发信息

Oracle 使用TRACE进行SQL性能分析

2026/4/3 2:57:10发布23次查看
设置sql_trace参数为true会对整个实例进行跟踪,包括所有进程:用户进程和后台进程,会造成比较严重的性能问题,生产环境一定要慎
设置sql_trace参数为true会对整个实例进行跟踪,包括所有进程:用户进程和后台进程,会造成比较严重的性能问题,生产环境一定要慎用。
一、根据相关事务或者sql 执行trace操作:
1) 使用前需要注意的地方
1,初始化参数timed_statistics=true。允许sql trace 和其他的一些动态性能视图收集与时间(cpu,elapsed)有关的参数。一定要打开,不然相关信息不会被收集。这是一个动态的参数,也可以在session级别设置。
sql>alter session set titimed_statistics=true
2,max_dump_file_size跟踪文件的大小的限制,如果跟踪信息较多可以设置成unlimited。可以是kb,mb单位,9i开始默认为unlimited这是一个动态的参数,也可以在session级别设置。
sql>alter system set max_dump_file_size=300
sql>alter system set max_dump_file_size=unlimited
2)trace执行过程:
1.      启动sql_trace:sql> alter session set sql_trace=true;
2.      进行相关事务或者sql操作:sql> select * from t;
3.      关闭sql_trace:sql> alter session set sql_trace=false;
也可以通过oracle提供的系统包 dbms_system.set_sql_trace_in_session来实现。例如:首先从os上利用top命令找到当前占用cpu资源最高的一个进程的pid号;然后在数据库中根据pid号找到相应的sid和serial#。
sql>execute dbms_system.set_sql_trace_in_session(sid,serial#,true);
sql>execute dbms_system.set_sql_trace_in_session(sid,serial#,false);
二、获得当前生成trace文件的位置:
在oracle 10g中,sql_trace生成的trace文件默认路劲是$oracle_base/admin/sid/udump;到了11g,trace 默认路径在:$oracle_base/diag/rdbms/orcl/orcl/trace目录下。
也可以通过查询出trace文件所在的默认路径:select value  from v$parameter where name = 'user_dump_dest'(background_dump_dest)
如需修改:alter system set user_diagnostic_dest = 'd:\oracle\trace';
或者: select tracefile from v$process where addr in (select paddr from v$session where sid in (select sid from v$mystat));
此外,也可以直接用如下sql直接查出当前的trace文件名。
select      d.value || '\'  || lower (rtrim (i.instance, chr (0)))  || '_ora_' || p.spid || '.trc'
as trace_file_name
from  (select  p.spid
from  v$mystat m, v$session s, v$process p
where  m.statistic# = 1 and s.sid = m.sid and p.addr = s.paddr) p,
(select  t.instance
from  v$thread t, v$parameter v
where  v.name = 'thread'
and (v.value = 0 or t.thread# = to_number (v.value))) i,
(select  value
from  v$parameter
where  name = 'user_dump_dest') d;
三、转换生成trace文件:
sql_trace 生成最原始的trace文件的可读性比较差,所以通常我们使用tkprof 工具来处理trace文件。 tkprof 工具是oracle 自带的一个工具,用于处理原始的trace文件,它的作用主要是合并汇总trace文件中的一些项,规范化文件的格式,使文件更具有可读性。 tkprof 是系统级别的,直接在系统下执行即可。
注意:tkprof 工具只能用在处理sql_trace和10046事件产生的trace,其他事件如10053不能处理。
格式:  tkprof tracefile outputfile [optional | parameters ]
c:/users/administrator/vidi>tkprof d:/app/administrator/diag/rdbms/orcl/orcl/trace/orcl_ora_3048.trc orcl_ora_3048.txt sys=no
参数和选项:
explain=user/password执行explain命令将结果放在sql trace的输出文件中
sys=[yes/no]确定系统是否列出由sys用户产生或重调的sql语句。设置为no后,trace文件具有更佳的可读性
sort=sort_option按照指定的方法对sql trace的输出文件进行降序排序
sort_option选项:设置排序选项,可以用逗号分隔多个选项。默认是跟踪文件中发现的sql顺序。
prscnt按解析次数排序
prscpu按解析所花cpu时间排序
prsela按解析所经历的时间排序
prsdsk按解析时物理的读操作的次数排序
prsqry按解析时以一致模式读取数据块的次数排序
prscu按解析时以当前读取数据块的次数进行排序
execnt按执行次数排序
execpu按执行时花的cpu时间排序
exeela按执行所经历的时间排序
exedsk按执行时物理读操作的次数排序
exeqry按执行时以一致模式读取数据块的次数排序
execu按执行时以当前模式读取数据块的次数排序
exerow按执行时处理的记录的次数进行排序
exemis按执行时库缓冲区的错误排序
fchcnt按返回数据的次数进行排序
fchcpu按返回数据cpu所花时间排序
fchela按返回数据所经历的时间排序
fchdsk按返回数据时的物理读操作的次数排序
fchqry按返回数据时一致模式读取数据块的次数排序
fchcu按返回数据时当前模式读取数据块的次数排序
fchrow按返回数据时处理的数据数量排序
注:这些排序中经常用到的是fchdsk,fckchela ,fchqry.因为有问题的sql一般都是大的查询造成的,当然更新,插入,删除时也会存在全表扫描,这就需要:exedsk,exeqry,exeela等选项。根据具体情况具体分析。
cpu时间和elapsed时间都是以秒为单位,而且两个值基本上一样,但我比较常用elapsed,他是反映的用户相应时间,从运行sql到用户得到结果的时间,会更实际些。
tkprof输出文件各列的含义:
parse:将sql语句转换成执行计划,包括检查是否有正确的授权,需要到得表,列及其他引用到得对象是否存在,这些信息分别存在v$librarycache.v$rowcache..
execute:oracle实际执行的语句,如:insert,update,delete,这些会修改数据,对于select操作,这部只是确定选择的行数。
fetch:返回查询获得的行数,只有执行select会被收集。
count:这个语句被parse,execute,fetch的次数的统计
cpu:这个语句所有的parse,execute,fetch所用的cpu总的时间,以秒为单位。如果timed_statistics 关闭的话,值为0。
elapsed:这个语句所有的parse,execute,fetch所消耗的总的时间,以秒为单位。如果timed_statistics 关闭的话,值为0。
disk:这个语句所有的parse,,execute,fetch从磁盘上的数据文件中读取的数据块的数量
query:在一致性读的模式下,这个语句所有的parse,execute,fetch所获取的数据块数量(这部分是从内存读取的也就是逻辑读取的,相当于执行计划里的consistent gets)
current:在current模式下,这个语句所有的parse,execute,fetch所获取的数据块数量,一般是current模式下发生的delect,insert,update的操作都会获取。数据块
rows:语句返回的行数,不包括子查询中返回的记录数目。对于select语句,返回在fetch这步,对于insert,delete,update操作,返回记录是在execute这步。
四、对trace文件分析过程:
1,先找磁盘多的sq l(sort= fchdsk ),意味着全表扫描;
2,找运行时间长的(sort= fchela),意味着sql可能写的不好或磁盘,逻辑读较多;
3,找出一致性读较多的(sort= fchqry),当表不是很大的时候(可能全部缓存住了),没有发生磁盘读,但不意味着不需要建立索引,或者sql需要优化;
该用户其它信息

VIP推荐

免费发布信息,免费发布B2B信息网站平台 - 三六零分类信息网 沪ICP备09012988号-2
企业名录 Product