存储过程调优之“10046”事件

一、前言

    前段时间应需求,写存储过程,以满足避免在大数据量的原始表中进行直接的查询工作。从而生成一张中间表,用于以后各个维度的报表统计

  从而提高每张报表的查询效率。久而久之,随着存储过程越来越多,每天的任务耗时也越来越大,从而不得不考虑对存储过程进行优化。

二、"10046"事件

    Oracle的10046事件,它可以跟踪应用程序所执行的SQL语句,从而得到每条SQL的解析次数,执行次数,CPU使用时间,每条SQL中每个部位的耗时等。这样,我们

  就可以根据这些信息来分析、定位数据库的性能问题。

    10046event是oracle用于系统性能分析时的一个最重要的事件,当激活这个事件后,将通知oracle kernel追踪会话的相关即时信息,并写入相应的trace文件中。这些 

  信息包括SQL的解析,绑定变量的使用情况,会话中发生的等待时间以及会罗列出主要耗时的部分等。

    10046event有不同的级别(level),分别追踪记录不同程度的信息。需要注意的是,级别是向下兼容的 即高一级别生成的trace所包含的信息包含低一级别的所有信息,

  追踪级别大致有:

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

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

     level 8:包括等待事件。

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

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

     (Tips) 向下兼容。

三、10046event 追踪最小化例子

    命令行/plsql 键入如下:

    alter session set tracefile_identifier='10046';-----------------------设置追踪标识符

    alter session set events '10046 trace name context forever, level 12';----------------开启追踪,并设置追踪级别

    select * from ALL_OBJECTS; -----------------所要追踪的SQL语句

    alter session set events '10046 trace name context off';------------关闭追踪

    执行完后,即所有会话都结束后,oracle将会生成一个orcl_ora_XXXX_10046.trc 的文件,根据个人目录不同,会生成在不同的

  目录当中,我们可以用locate命令来进行查询

    得到这个文件后,我们再用tkprof这个命令,对该文件进行格式化,便于我们的阅读。

    如:tkprof traceorcl_ora_xxxx_10046.trc  10046.txt sys=no sort=prsela,exeela,fchela

四、解析trace文件

    我们打开10046.txt,对于初学者来说,并不能好好的去分析包含的信息,因为其中包含了许多“名词”,下面将会对此进行介绍

    1)摘录第一部分,SQL语句的执行情况总览
      select *
      from
      ALL_OBJECTS


    call     count       cpu    elapsed       disk      query    current        rows
    ------- ------  -------- ---------- ---------- ---------- ----------  ----------
    Parse        1      0.00       0.00          0          0          0           0
    Execute      1      0.00       0.00          0          0          0           0
    Fetch        2     10.94      10.68     222186     222957          0           1
    ------- ------  -------- ---------- ---------- ---------- ----------  ----------
    total        4     10.94      10.68     222186     222957          0           1

    关于统计表格的标题信息中count、cpu、elapsed、disk、query、current和rows的说明在该trace文件的最前端有一个简要的说明,这里再分别赘述一下。
    count   :查询在此阶段执行的次数;
    cpu     :该查询在此阶段的CPU时间量,以毫秒为单位;
    elapsed :花费在此阶段上的挂钟时间,该值比cpu值大的时候,表明存在等待事件;
    disk    :执行物理I/O次数;
    query   :在意一致性检索方式获得块时,执行逻辑I/O次数;
    current :逻辑I/O次数;
    rows    :此阶段,被处理或受影响的行数。

    关于第一列的赘述:
    Parse   :软编译和硬编译次数;
    Execute :在open和execute语句中完成的内容;
    Fetch   :select中会有数据显示,在update语句中不会有数据显示。

    2)摘录运行环境信息
    Misses in library cache during parse: 0
    Optimizer mode: ALL_ROWS
    Parsing user id: 51

    第一行的“0”表示查询使用的是软解析(soft parse)。
    优化模式是:ALL_ROWS
    使用最后一行的用户ID可以获得执行时的会话信息。获得用户信息可以通过下面的SQL语句完成。
    sys@ora10g> select * from all_users where user_id = 51;

    USERNAME                          USER_ID CREATED
    ------------------------------ ---------- -------------------
    SEC                                    51 2015-02-15 13:04:03

    3)摘录执行计划信息
    Rows     Row Source Operation
    -------  ---------------------------------------------------
          1  SORT AGGREGATE (cr=222957 pr=222186 pw=0 time=10686023 us)
 100000000   INDEX FAST FULL SCAN PK_T (cr=222957 pr=222186 pw=0 time=100000562 us)(object id 45619)

    有趣发现:通过第二行可以得到这个t表的数据量,这里显示结果是1亿。
    “解剖”上面出现的几个重要参数:
    cr=222957          -- 一致性读取
    pr=222186          -- 物理读取
    pw=0               -- 物理写
    time=100000562 us  -- 占用时间,单位:微妙 百万分之一秒


    4)摘录等待事件
    Elapsed times include waiting on following events:
      Event waited on                             Times   Max. Wait  Total Waited
      ----------------------------------------   Waited  ----------  ------------
      SQL*Net message to client                       3        0.00          0.00
      SQL*Net message from client                     3        0.00          0.00
      db file scattered read                      14249        0.00          1.10
      db file sequential read                        59        0.00          0.00
    
    通过这段等待事件的描述,可以清楚的得到在执行SQL语句的过程中都出现了哪些引人注目的等待事件。比如上面显示出的“db file scattered read”和“db file     sequential read”信息,如果此类信息在生产环境中大量出现,就需要重点深入分析和研究了。

五、总结 

    对于10046事件,本身是非常消耗资源,对于存储过程,如果对此进行设置跟踪,会增加该存过的耗时,因此在使用过程中应避免一直启用追踪。但对于存储过程的调优,其包含的各种信息是非常有助于对整个存过进行有效的分析,对于10046扩展追踪,非常适合于对那些把很多业务逻辑写入到存储过程中的软件调优

  

  

原文地址:https://www.cnblogs.com/sicd/p/4378042.html