ablog

不器用で落着きのない技術者のメモ

Oracle Database でSQLトレースを取得する方法

SQLトレースを取得する。

自セッション*1
  • SQLトレースを有効化する(開始)。*2
    • waits: true にすると待機イベントと待機時間が出力される(デフォルト値: true)
    • binds: true にするとバインド変数の値が出力される(デフォルト値: false)
    • plan_stat: STAT# で出力されるセクション(実行計画と実行統計)の出力頻度
      • FIRST_EXECUTION: 初回のみ出力(デフォルト)
      • ALL_EXECUTIONS: 実行のたびに出力(11.1以降)
      • NEVER: 出力しない
-- ALTER SESSION SET EVENTS '10046 trace name context forever, level 12'; と同じ
EXECUTE DBMS_SESSION.SESSION_TRACE_ENABLE(waits => true, binds => true);
-- ALTER SESSION SET EVENTS '10046 trace name context forever, level 16'; と同じ
EXECUTE DBMS_SESSION.SESSION_TRACE_ENABLE(waits => true, binds => true, plan_stat=>'ALL_EXECUTIONS');
  • トレースファイル名に含める文字列を指定する*3
    • ファイル名は _ora__TEST01_SQLTRACE.trc となる。
ALTER SESSION SET TRACEFILE_IDENTIFIER = "TEST01_SQLTRACE";
  • SQLトレースを取得したいSQLを実行する
SELECT * FROM ...;
  • SQLトレースを無効化する(終了)。
EXECUTE DBMS_SESSION.SESSION_TRACE_DISABLE;
  • トレースファイルのパスを確認する*4
set linesize 100
col TRACEFILE for a100
SELECT p.tracefile FROM   v$session s JOIN v$process p ON s.paddr = p.addr WHERE s.sid = SYS_CONTEXT('userenv','sid');

TRACEFILE
----------------------------------------------------------------------------------------------------
/u01/app/oracle/diag/rdbms/orcl/orcl1/trace/orcl1_ora_40357_TEST01_SQLTRACE.trc
  • SQLトレースの中身を確認する。
    • 長時間実行されるSQLの場合、実行中に tail -f や less +F などで SQLトレースの中身を眺めるのがオススメです。
    • tkprof で整形前のSQLトレースでは、平均値でなく1回のI/O(例えば db file sequential read)に何マイクロ秒かかったかなどミクロな分析ができるため、ミクロな分析が必要な場合は生トレースを EXCEL などでグラフ化するのがオススメです。
tail -f /u01/app/oracle/diag/rdbms/orcl/orcl1/trace/orcl1_ora_40357_TEST01_SQLTRACE.trc
  • tkprof で整形する。
cd /u01/app/oracle/diag/rdbms/orcl/orcl1/trace
tkprof orcl1_ora_40357_TEST01_SQLTRACE.trc orcl1_ora_40357_TEST01_SQLTRACE.tkprof sort=exeela
他セッション(SID, SERIAL# 指定)
  • セッションIDとシリアル番号を確認する。
select SID,SERIAL#,USERNAME,OSUSER,PROCESS,TYPE,MODULE,SERVICE_NAME,sql_trace from v$session where TYPE='USER';

   SID SERIAL# USERNAME   OSUSER     PROCESS    TYPE       MODULE                                             SERVICE_NA SQL_TRAC
------ ------- ---------- ---------- ---------- ---------- -------------------------------------------------- ---------- --------
     8    6703 SYS        oracle     55291      USER       oraagent.bin@...jp.oracle.com (TNS V               pdb        DISABLED
   408   52686 SYS        oracle     55291      USER       oraagent.bin@...jp.oracle.com (TNS V               SYS$USERS  DISABLED
   611   32130 SYS        oracle     40356      USER       sqlplus@...jp.oracle.com (TNS V1-V3)               SYS$USERS  ENABLED
  1006   41072 SYS        oracle     55291      USER       oraagent.bin@...jp.oracle.com (TNS V               SYS$USERS  DISABLED
  1010    5332            oracle     111007     USER                                                          SYS$USERS  DISABLED
  1206   59729 SYS        oracle     55291      USER       oraagent.bin@...jp.oracle.com (TNS V               SYS$USERS  DISABLED
  1211    6902            oracle     111005     USER                                                          SYS$USERS  DISABLED
  • SQLトレースを有効化する(開始)。
BEGIN 
  DBMS_MONITOR.SESSION_TRACE_ENABLE(
    session_id => 611, 
    serial_num => 32130,
    waits => true, 
    binds => true,
    plan_stat=>'ALL_EXECUTIONS');
END;
/
  • SQLトレースを取得したいSQLを実行する。
  • SQLトレースを無効化する(終了)。
EXECUTE DBMS_MONITOR.SESSION_TRACE_DISABLE(session_id => 611, serial_num => 32130);
他セッション(SERVICE_NAME, MODULE 指定)
  • SERVICE_NAME, MODULE を確認する。
select SID,SERIAL#,USERNAME,OSUSER,PROCESS,TYPE,MODULE,SERVICE_NAME,sql_trace from v$session where TYPE='USER';

   SID SERIAL# USERNAME   OSUSER     PROCESS    TYPE       MODULE                                             SERVICE_NA SQL_TRAC
------ ------- ---------- ---------- ---------- ---------- -------------------------------------------------- ---------- --------
     8    6703 SYS        oracle     55291      USER       oraagent.bin@...jp.oracle.com (TNS V   pdb         DISABLED
    16   44847            oracle     34303      USER                                                          SYS$USERS  DISABLED
   408   52686 SYS        oracle     55291      USER       oraagent.bin@...jp.oracle.com (TNS V   SYS$USERS   DISABLED
   611   32130 SYS        oracle     40356      USER       sqlplus@...jp.oracle.com (TNS V1-V3)   SYS$USERS   DISABLED
   813   57274            oracle     34305      USER                                                          SYS$USERS  DISABLED
  1006   41072 SYS        oracle     55291      USER       oraagent.bin@...jp.oracle.com (TNS V   SYS$USERS   DISABLED
  1206   59729 SYS        oracle     55291      USER       oraagent.bin@...jp.oracle.com (TNS V   SYS$USERS   DISABLED
  1208   27792            oracle     34301      USER                                                          SYS$USERS  DISABLED
  1609   30466            oracle     34307      USER                                                          SYS$USERS  DISABLED
  • SQLトレースを有効化する(開始)。
BEGIN 
  DBMS_MONITOR.SERV_MOD_ACT_TRACE_ENABLE(
    service_name  => 'SYS$USERS',
    module_name   => 'sqlplus@...jp.oracle.com (TNS V1-V3)',
    waits         =>  true,
    binds         =>  true,
    plan_stat=>'ALL_EXECUTIONS');
END;
/
  • SQLトレースを取得したいSQLを実行する。
  • SQLトレースを無効化する(終了)。
BEGIN 
  DBMS_MONITOR.SERV_MOD_ACT_TRACE_DISABLE(
    service_name  => 'SYS$USERS',
    module_name   => 'sqlplus@...jp.oracle.com (TNS V1-V3)');
END;
/

前提条件

初期化パラメータ
  • MAX_DUMP_FILE_SIZE*5
    • サイズが指定されている場合、トレースファイルのサイズがそのサイズまでしか出力されない
    • デフォルト値: unlimited
  • TIMED_STATISTICS*6
    • true になっていること。
    • デフォルト値: true
    • STATISTICS_LEVEL*7 が TYPICAL または ALL の場合、TIMED_STATISTICS が true になる。
設定の確認と変更例
SQL> select value from V$DIAG_INFO where name = 'Diag Trace';

VALUE
----------------------------------------------------
/u01/app/oracle/diag/rdbms/orcl/orcl1/trace
  • 初期化パラメータの値を確認する。
SQL> show parameters MAX_DUMP_FILE_SIZE

NAME                                 TYPE        VALUE
------------------------------------ ----------- ------------------------------
max_dump_file_size                   string      unlimited
  • 初期化パラメータの値をセッションレベルで変更する。
    • 自セッションでSQLトレース取得するときだけ変更したい場合はセッションレベルでの変更でよい。
SQL> alter session set MAX_DUMP_FILE_SIZE = unlimited;

Session altered.
  • 初期化パラメータの値をシステムレベルで変更する。
    • アプリケーションから発行されるSQLSQLトレースを外から取得したく、アプリに alter session 文を追加できない場合などは alter system でシステムレベルで変更する(全セッションが影響を受ける)。
SQL> alter system set MAX_DUMP_FILE_SIZE = unlimited scope=both;

Session altered.

参考

  • Oracle Database 12c Performance Tuning Recipes: A Problem-Solution Approach

10-15. Tracing a SQL Session
...
All the parameters for the session_trace_enable procedure are self-evident, except the plan_stat parameter. You can set the following values for this parameter:

    • never: The trace file won’t contain any information about row source operations.
    • first_execution (same as setting the plan_stat parameter to the value null): Row source information is written once, after the first execution of a statement.
    • all_executions: Execution plan and execution statistics are written for each execution of the cursor, instead of only when the cursor is closed.

Since an execution plan for a statement can change during the course of a program run, you may want to set the plan_stat parameter to the value all_executions if you want to capture all possible execution plans for a statement.

http://www.amazon.co.jp/Oracle-Database-Performance-Tuning-Recipes/dp/1430261870