欢迎光临
我们一直在努力

10046 Event 漫步

10046 Event 漫步

我们知道,Oracle提供了Internal Events以便Oracle Support人员利用其对Oracle的内部行为进行一些更为深入细致的记录与追踪,从而分析查找并加以解决Oracle用户所遇到的各类棘手问题。对于绝大部分的Internal EventsOracle是没有官方文档加以阐述的,不过,这些Events中有几个是被公认为非常重要并被广泛研究和采用的。这其中,最重要的就是在进行Sql Tuning时常利用的10046 Event

如果你对Oracle性能调优很感兴趣或者比较擅长,那么你对Oracle10046 Event一定不会陌生。10046 Event是对Oracle进行系统性能分析时一个最重要的手段。当激活这个事件后,将通知Oracle
Kernel
追踪会话的相关即时信息,并写入到相应Trace文件中。这些有用的信息主要包括:Sql是如何进行解析及其执行计划,绑定变量的使用情况,会话中发生的等待事件等。

10046 Event可分成不同的级别(level),分别追踪记录不同程度的有用信息。对于这些不同的级别,应当注意的是向下兼容的,即最高级的Trace信息包含低于此级的所有信息。

10046 Event的追踪级别大致有:

level 1:跟踪Sql语句,包括解析、执行、提取、提交和回滚等;

level 4:包括变量的详细信息;

level 8:包括等待事件;

level 12:包括绑定变量与等待事件。

其中,level 1相当于打开了sql_trace

10046 Event启用前的准备:

前提条件:(先确保实例或会话的环境符合条件)

1、  必须确保timed_statisticsTRUE,这个参数可以在会话级上进行修改。

2、  为了确保EventTrace输出能够完整进行,还要调整此会话对Trace文件大小的限制,一般地,将max_dump_file_size设置为一个很大的阙值,或者取消此限制,即设置为UNLIMITED。(不建议设置为UNLIMITED,因为有可能会造成磁盘空间使用异常)

在设置完了上述条件后,就可以启用Event进行后台跟踪了。

Oracle Event的启用可以在实例级或者会话级上来进行。其中,实例级的启用方式是在初始化参数文件中设置Event参数的值。如果想要在实例级启用10046 Event,则可在初始化参数文件pfile中增加如下一行:

event=’10046 event trace name context forever, level n’

或者:

SQL >alter system set events ‘10046
trace name context forever, level
n’;

由于Event的启用对系统资源消耗很大,因此,一般不建议在生产运行库中启用实例级上的Event。实际情况中,也是没有必要对整个实例进行EventTRACE。下面就主要针对会话级10046 Event的情况进行大致阐述。

启用10046 Event的几种方式

一种是在当前会话启用Event。可以利用alter session set events 语句,如下:

SQL >alter session set events ‘10046
trace name context forever, level
n’;

一种是在当前会话中对别的会话启用Event跟踪。可以利用Oracle提供的包dbms_system来完成,如下:

SQL >exec dbms_system.set_ev(sid,serial#,10046, n,’’);

说明:

1、获取当前会话的sidserial#可以通过下面语句来实现:

SQL >select sid, serial# from v$session
where sid = (select sid from v$mystat where rownum=1);

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

相当于打开了sql_trace

10046 Event的关闭:

可以通过下面的语句来关闭当前会话的Event

SQL >alter session set events ‘10046
trace name context off’;

也可以利用dbms_system包来关闭某个会话的Event

SQL >execute
dbms_system.set_ev(sid,serial#,0,’’);

这里应当注意的是,TRACE将消耗相当的系统资源,因此我们在使用TRACE的时候应当慎重。对于在线的生产系统,在必要时应当选择合适的时候进行TRACE操作,并且应当及时关闭。

Trace文件的查找:

当利用事件trace完当前或某个session后,接下来我们的工作就是找到Oracle生成的trace文件了。Oracle的初始化参数文件中user_dump_dest的设置将决定trace文件的生成位置。我们可以通过查看参数文件,或者借助sqlplus来查询得出user_dump_dest所设定的路径:

SQL> show parameter user_dump_dest

NAME        
TYPE    VALUE

———————- ———–
——————————

user_dump_dest  string   
/oracle/app/oracle/admin/SIDDB/udump

SQL> col name format a20

SQL> col value format a50

SQL> select name,value from v$parameter
where name=’user_dump_dest’;

NAME        
VALUE

——————– ————————————————–

user_dump_dest  /oracle/app/oracle/admin/ SIDDB /udump

unix下,trace文件的命名规则一般是sid_ora_spid.trcspid为该session对应的外部进程号。

TKPROF的用途和使用:

Oracle提供了一个工具tkprof来对trace文件进行格式的翻译,以便trace文件中记录的信息能够被我们容易获取和理解。

基本用法:

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

Trace文件中发现有用的信息,寻找必要的性能调整点:

大部分情况下,通过10046
Event Trace
到文件里的信息包含了此会话中可能存在的性能问题。可以根据trace到的等待事件、SQL语句执行情况以及绑定变量的使用情况来进行分析和查找。这部分的内容就要结合实际应用情况,具体情况具体分析了。

另外,需要说明的一点是,不但要能够看懂tkprof后的trace文件,学会看traceraw文件也是很重要的,具体的可以参照Metalink39817.1文章。

小知识:

检查当前会话的sql_trace状态或级别:

SQL>set serveroutput on

2         declare i_event number;

3         begin

4         sys.dbms_system.read_ev(10046,i_event);

5         dbms_output.put_line(‘the
session sql_trace level is: ‘||i_event);

6         end;

7         /

the session
sql_trace level is: 12

PL/SQL 过程已成功完成。

未经允许不得转载:SRE空间 » 10046 Event 漫步

分享到:更多 ()

评论 抢沙发

评论前必须登录!

 

oracle