10046

来源:互联网 发布:苹果抢购软件 编辑:程序博客网 时间:2024/06/03 15:51

参考:
http://blog.csdn.net/ora_unix/article/details/17006045

timed_statistics
这个参数决定了是否收集与时间相关的统计信息,如果这个参数为false的话,那么sql trace的结果基本没有多大的用处,默认情况下这个参数设置为true。
max_dump_file_size
dump文件的大小,也就是决定是否限制sql trace文件的大小,在一个很忙的系统上面做sql trace的话可能会生成很多的信息,因此最好在会话级别将这个参数设置成unlimited。
tracefile_identifier
给trace文件设置识别字符串,这是个非常有用的参数,设置一个易读的字串能更快的找到trace文件。


几个重要参数的用法讲解:

sys参数,如果不指定默认值为yes.这个参数的含义是,输出文件中是否包含以SYS用户运行的sql语句。这个参数还是蛮有用的,我们执行sql语句的时候,后台经常会执行很多递归的语句,比如你输入了SELECT * FROM TEST;如果这个语句是硬解析的话,那么会产生很多递归的SQL,递归的去查询表的统计信息,列的统计信息,索引的统计信息等,当然递归的不止是这些。这些递归的sql都是以SYS用户运行的,如果你不希望看到这些递归SQL,那么就加上这个参数sys=no.
record参数,它指定的是一个路径下的文件,这个文件用来生成在跟踪文件中找到的所有的非递归SQL。比如你在SQLPLUS里执行了三条语句,select * from a;select * from b;select * from c;,那么如果你指定了这个参数如:record=c:\test.log,那么你用tkprof格式化跟踪文件后,这个test.log里就会记录这三个SQL。这个特性在有些时候还是满有用的,因为跟踪文件往往都会比较大,找起来会比较费劲,我们可以通过指定这个参数先大体了解下,跟踪文件里都有哪些非递归SQL。而且这个功能还有助于我们重演SQL语句(绑定变量的不可以)。
aggregate参数,它指定tkprof是否将同样文本内容的sql聚合处理,比如,你执行了十次select * from a,如果你指定这个参数为no(默认情况),那么产生的输出文件会有十个这样语句的执行信息,如果你指定的是yes,那么tkprof会把这十次的执行信息汇总显示。这个参数怎么指定就看你的需要了,个人觉得还是满有用的一个参数。
sort参数,这个参数是经常使用到的一个参数,它用来指定tkprof输出文件里sql语句按照什么排序,默认是按照执行的先后顺序排序的,我们可以指定它按照其他方式排序,比如磁盘读取数,CPU时间等。这个参数最经常用的方式是:sort=prsela,exeela,fchela,其实这三个值加起来就是响应时间,即按照响应时间排序。这里别产生误解,tkprof会根据prsela,exeela,fchela三个值的和进行排序,而不是像SQL语句似的一个个的排序。
print参数,它经常搭配sort参数一起使用,用来指定tkprof输出sql语句的数量。这两个参数搭配使用起来就比较妙,比如你想知道一个跟踪文件里响应时间排前十的SQL,那么你就可以sort=prsela,exeela,fchela print=10来搭配使用。
explain参数,这个参数的含义是为每一个SQL提供一个执行计划。使用的方法是explain=用户名/密码,其实原理很简单,就是通过你指定的用户名,密码登陆数据库,然后为每一个sql执行以下explain plan for sql,输出到plan_table里,最后添加到输出文件里。注意,由于explain plan for 命令要求执行操作的用户要对sql语句里包含的对象都有执行权限,如果包含视图,也要对视图基于的基础表有执行权限,否则产生不了执行计划。注意增加了这个参数后,执行tkprof会比较慢。
wait参数,指定输出文件中包含不包含等待事件,默认是包含的。一般都取默认值。
基本最常用到的就这些,其他的我就不介绍了,平时这些也就基本够用了。


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


alter system kill session '913,2089';-----------------------dbms_monitor---------------------------------------------------------execute sys.dbms_system.set_bool_param_in_session(913, 2089,'timed_statistics', true); execute sys.dbms_system.set_int_param_in_session(913, 2089,'timed_os_statistics', 1); execute sys.dbms_system.set_int_param_in_session(913,2089,'max_dump_file_size', 2147483647); alter session set tracefile_identifier='mytrace_dj';begin sys.dbms_monitor.session_trace_enable(913,2089,true,true); end;begin sys.dbms_monitor.session_trace_disable(913,2089); end;--跟踪自己的会话只需要执行以下命令:alter session set timed_statistics=truealter session set max_dump_file_size=unlimitedalter session set tracefile_identifier='mytrace_dj'------------------------execute dbms_monitor.session_trace_enable(waits=>true, binds=>true);execute dbms_monitor.session_trace_disable(waits=>true, binds=>true);--------------------dbms_system------------------------------------------------------------begin sys.dbms_system.set_bool_param_in_session(913, 2089,'timed_statistics', true); sys.dbms_system.set_int_param_in_session(913, 2089,'timed_os_statistics', 1); sys.dbms_system.set_int_param_in_session(913,2089,'max_dump_file_size', 2147483647); sys.dbms_system.set_ev(913,2089, 10046, 12, ''); end;-- 开启level 12的traceexec sys.dbms_system.set_ev(913,2089, 10046, 12, '');-- 关闭traceexec sys.dbms_system.set_ev(913,2089, 10046, 0, '');begin sys.dbms_system.set_ev(913,2089, 10046, 0, ''); end;---------------------dbms_support-------------------------------------------------------------error*****-- 开启级别为12的traceexec sys.dbms_support.start_trace_in_session(913,2089, true, true);-- 关闭traceexec sys.dbms_support.stop_trace_in_session(913,2089);-----------------------oradebug---------------------------------------------------------select p.pid oracle_process_id,p.spid os_process_id,s.sid from v$process p,v$session s where s.paddr = p.addr and s.sid = &sid;-- os_process_idoradebug setospid 28049584--oracle_process_idoradebug setorapid 192-- 设置trace文件大小oradebug unlimit;-- 开启级别为12的traceoradebug event 10046 trace name context forever ,level 12;oradebug tracefile_name--关闭traceoradebug event 10046 trace name context off;oradebug tracefile_name--使用oradebug 生成10046 事件,跟踪自己的会话oradebug setmypidoradebug unlimitoradebug event 10046 trace name context forever,level 12;oradebug event 10046 trace name context off;oradebug tracefile_name----------------------------------------------------------------------------------其他用户session的跟踪文件select    d.value|| '/'|| lower (rtrim (i.instance, chr (0)))|| '_ora_'|| p.spid|| '.trc'   trace_file_namefrom (select p.spidfrom v$session s, v$process pwhere s.sid = '913' and s.serial# = '2089' and p.addr = s.paddr) p,(select t.instancefrom v$thread t, v$parameter vwhere v.name = 'thread'and (v.value = 0 or t.thread# = to_number (v.value))) i,(select valuefrom v$parameterwhere name = 'user_dump_dest') d;

0 0
原创粉丝点击