如何收集用来诊断性能问题的10046 Trace(SQL_TRACE) (文档 ID 1523462.1)

文档内容

  用途
  问题和答案
  收集10046 trace
  参考

适用于:

Oracle Database - Enterprise Edition - 版本 8.1.5.0 到 11.2.0.3 [发行版 8.1.5 到 11.2]
本文档所含信息适用于所有平台

用途

这篇文档列举几种有效地收集10046 Trace的方法,用于诊断查询性能方面的问题。
此文档可供DBA, 开发和技术支持人员使用。

问题和答案

收集10046 trace

Event 10046是为Oracle session收集扩展的sql_trace信息的标准方法。
关于这个event的详细描述请参见以下文档:

Note 21154.1  EVENT: 10046 "enable SQL statement tracing (including binds/waits)"


通常为了诊断SQL调优类问题,我们需要记录下这些语句在执行过程中产生的等待以及bind variables(绑定变量)的信息。 这些信息可以通过级别为12的10046 trace获得。下面的例子列举了在各种场景下,如何设定10046事件。

  • Trace文件的位置
  • 在Session级打开trace
  • 跟踪一个已经开始的进程
  • 实例层的跟踪
  • 初始化参数设置
  • 通过logon trigger设置跟踪
  • 用SQLT收集trace
  • 用DBMS_MONITOR进行跟踪
  • 其它特定场景下打开跟踪的方法
  • Trace文件解析

  • Trace文件的位置

    11g R1以上:

    从11gR1开始,Oracle引入了新的诊断结构,以参数DIAGNOSTIC_DEST控制存放trace文件与core文件的路径。
    可以用以下命令,获取DIAGNOSTIC_DEST的位置:
      SQL> show parameter diagnostic_dest

    11gR1以前:

    如果是用户进程,10046 trace文件会被生成在user_dump_dest下;如果是后台进程,trace文件会被生成在background_dump_dest下。
    下面的命令可以显示user_dump_dest:
      SQL> show parameter user_dump_dest

    注:下面的某些例子中会设定tracefile_identifier,通过这个设置可以帮助我们更容易的找到生成的trace文件。

  • 在Session级打开trace

    适用于SQL语句可以在新的session创建后再运行。
    在session级收集10046 trace:
    alter session set tracefile_identifier='10046'; 

    alter session set timed_statistics = true;
    alter session set statistics_level=all;
    alter session set max_dump_file_size = unlimited;

    alter session set events '10046 trace name context forever,level 12';

    -- 执行需要被trace的SQL --

    select * from dual;
    exit;
    如果不退出当前session, 可以用以下命令关闭trace:
    alter session set events '10046 trace name context off';
    注意,如果session没有被彻底地关闭并且跟踪被停止了,某些重要的trace信息的可能会丢失。
    注意:这里我们将"statistics_level"设置为all,这是因为有可能这个参数在系统级不是默认值"TYPICAL"(比如 BASIC)。为了收集性能相关问题的信息我们需要打开某个级别的statistics。我们推荐在 session 级将这个参数设置成 ALL 以便于收集更多的信息,尽管这不是必须的。
     
  • 跟踪一个已经开始的进程

    如果需要跟踪一个已经存在session,可以用 oradebug连接到session上,并发起10046 trace。

    1. 首先,用某种方法找到需要被跟踪的session.

      例如,在SQL*Plus里,找出目标session的OS的进程ID(spid):
      select p. PID,p. SPID,s.SID
      from v$process p,v$session s
      where s.paddr = p.addr
      and s.sid = &SESSION_ID
      /
      SPID 是操作系统的进程标识符(os pid)
      PID 是Oracle的进程标识符(ora pid)

    2. 一旦找到OS PID,就可以用以下命令初始化跟踪:

      假设需要被跟踪的OSPID是9834。
      以sysdba的身份登录到SQL*Plus并执行下面的命令:
      connect / as sysdba
      oradebug setospid 9834
      oradebug unlimit
      oradebug event 10046 trace name context forever,level 12
      记得把例子中的'9834' 替换成真实的os pid。

    注: 也可以通过oradebug使用 'setorapid'命令连接到一个session。

    下面的例中, 使用PID(Oracle进程标识符)(而不是SPID), oradebug命令将被改为:
    connect / as sysdba
    oradebug setorapid 9834
    oradebug unlimit
    oradebug event 10046 trace name context forever,level 12
    记得把例子中的9834替换成真实的ora pid。

    跟踪过程完成以后,关闭oradebug跟踪:
    oradebug event 10046 trace name context off

  • 实例层的跟踪

    注意: 在实例层设置跟踪需要非常小心,这是因为整体性能会由于所有session都被跟踪而受到影响。

    这个设置将会跟踪在这个参数设置“以后”创建的每个session。已经存在的session不会被跟踪。

    系统层的10046跟踪适用于当我们知道问题session会出现,但是不能预先识别它的时候。
    在这种情况下,可以打开系统层跟踪一小段时间,当问题被重现以后立即将其关闭,然后从已经生成的trace中查找需要的信息。

    用以下命令打开系统层的跟踪:
    alter system set events '10046 trace name context forever,level 12';
    用以下命令关闭在所有session中的10046跟踪:
    alter system set events '10046 trace name context off';

  • 初始化参数设置

    设置以下参数并重新启动实例后,实例上所有的session都会打开跟踪。
    event="10046 trace name context forever,level 12"
    移除这个参数并且重启实例, 或者使用下面的alter system命令可以关闭跟踪。
    alter system set events '10046 trace name context off';

  • 通过logon trigger设置跟踪

    有的时候当需要跟踪某个特定用户的操作时,可以使用logon trigger来打开跟踪
    下面是一个例子:
    CREATE OR REPLACE TRIGGER SYS.set_trace
    AFTER LOGON ON DATABASE
    WHEN (USER like '&USERNAME')
    DECLARE
    lcommand varchar(200);
    BEGIN
    EXECUTE IMMEDIATE 'alter session set tracefile_identifier=''From_Trigger''';
    EXECUTE IMMEDIATE 'alter session set statistics_level=ALL'; 
    EXECUTE IMMEDIATE 'alter session set max_dump_file_size=UNLIMITED';
    EXECUTE IMMEDIATE 'alter session set events ''10046 trace name context forever, level 12''';
    END set_trace;
    /
     
    为了能打开跟踪session, 执行trigger的用户需要被显式地授予'alter session' 权限. 例如,

    grant alter session to <USERNAME> ;
     

  • 用SQLT收集trace

    SQLTXPLAIN的Xecute方法生成的诊断文件中会包含10046 trace。正如XECUTE这个名字所示,SQLT会执行被分析的SQL语句, 然后生成一个诊断文件集(包括10046 trace)。详见:

    Note:215187.1 SQLT (SQLTXPLAIN) - Tool that helps to diagnose SQL statements performing poorly (Doc ID 215187.1)

    用这种方法生成的trace文件会被包含在SQLT输出包中, 格式为:
    sqlt_s 12345_10046_execute.trc

    12345是SQLT报告ID。

  • 用DBMS_MONITOR进行跟踪

    DBMS_MONITOR包提供几个打开跟踪的方法。详细请见:

    Note:293661.1 Tracing Enhancements In 10g Using DBMS_MONITOR

    Oracle Database PL/SQL Packages and Types Reference
    10g Release 2 (10.2)
    Part Number B14258-02
    Chapter 60 DBMS_MONITOR
  • 其它特定场景下打开跟踪的方法

    Note:21154.1 EVENT: 10046 "enable SQL statement tracing (including binds/waits)" 
    Note:1274511.1 General SQL_TRACE / 10046 trace Gathering Examples

    Note:160124.1 How to Set SQL Trace on with 10046 Event Trace which Provides the Bind Variables
    Note:371678.1 Capture 10046 Traces Upon User Login (without using a trigger)

    Note:1102801.1 How to Get 10046 Trace for Parallel Query
    Note:242374.1 Tracing PX session with a 10046 event or sql_trace

    Note:258418.1 Getting 10046 Trace for Export and Import

    如果您运行的是PL/SQL存储过程或包,那么可以通过使用PL/SQL profiler判断PL/SQL运行期间的时间消耗的具体信息。
    下面的文档介绍了PL/SQL profiler的使用方法:

    Note:243755.1 Implementing and Using the PL/SQL Profiler



  • Trace文件解析

    Note:199081.1 SQL_TRACE (10046), TKProf and Explain Plan - Overview Reference 
    Note:39817.1 Interpreting Raw SQL_TRACE and DBMS_SUPPORT.START_TRACE output 

    Note:224270.1 Trace Analyzer TRCANLZR - Interpreting Raw SQL Traces with Binds and/or Waits generated by EVENT 10046 

    NOTE:41634.1 - TKProf Basic Overview 
    NOTE:32951.1 - TKProf Interpretation (9i and below) 
    NOTE:760786.1 - TKProf Interpretation (9i and above) 
    NOTE:214106.1 - Using TKProf to compare actual and predicted row counts 

    Note:199083.1 * Master Note: SQL Query Performance Overview 
    Note:398838.1 * FAQ: SQL Query Performance - Frequently Asked Questions

REFERENCES

NOTE:1102801.1 - How to Get 10046 Trace for Parallel Query
NOTE:32951.1 - TKProf Interpretation (9i and below)
NOTE:371678.1 - Capture 10046 Traces Upon User Login (without using a trigger)
NOTE:39817.1 - Interpreting Raw SQL_TRACE output
NOTE:398838.1 - * FAQ: SQL Query Performance - Frequently Asked Questions
NOTE:41634.1 - TKProf Basic Overview

NOTE:199081.1 - SQL_TRACE (10046), TKProf and Explain Plan - Overview Reference
NOTE:199083.1 - * Master Note: SQL Query Performance Overview
NOTE:21154.1 - EVENT: 10046 "enable SQL statement tracing (including binds/waits)"
NOTE:214106.1 - Using TKProf to compare actual and predicted row counts
NOTE:215187.1 - SQLT (SQLTXPLAIN) - Tool that helps to diagnose a SQL statement performing poorly or one that produces wrong results
NOTE:224270.1 - TRCANLZR (TRCA): SQL_TRACE/Event 10046 Trace File Analyzer - Tool for Interpreting Raw SQL Traces

NOTE:243755.1 - Script to produce HTML report with top consumers out of PL/SQL Profiler DBMS_PROFILER data
NOTE:242374.1 - Tracing PX Session with a 10046 Event or Sql_trace
NOTE:1274511.1 - General SQL_TRACE / 10046 trace Gathering Examples

NOTE:75713.1 - Important Customer information about using Numeric Events
NOTE:293661.1 - Tracing Enhancements In 10g and 11g Using DBMS_MONITOR

NOTE:760786.1 - TKProf Interpretation (9i and above)
NOTE:258418.1 - Getting 10046 Trace for Export and Import

NOTE:160124.1 - How to Set SQL Trace on with 10046 Event Trace which Provides the Bind Variables
 
 

相关内容

   
 
 

产品

   
 
  • Oracle Database Products > Oracle Database > Oracle Database > Oracle Database - Enterprise Edition > RDBMS
 

关键字

   
 
ALTER SESSION SET EVENTS; ALTER SYSTEM SET EVENTS; CHINESE; DBMS_MONITOR; EVENT 10046; ORADEBUG; PL SQL; PROCEDURES; SQLTXPLAIN; SQL_TRACE; TRACE
 

翻译

   
 
  • 英语源
  • 中文简体中文
  • 日语日本語
  • 朝鲜语한국어

你可能感兴趣的:(如何收集用来诊断性能问题的10046 Trace(SQL_TRACE) (文档 ID 1523462.1))