WalkingAlone

実行計画の確認方法

実行計画は主に以下のような方法で取得することができます。本ページではそれぞれの設定手順を記載します。

・sqlplusでauto traceを設定する
・SQLトレースを設定する
・explain plan文を実行する
・動的パフォーマンスビューから確認する(9i~)

実行計画とは

実行計画とはSQL実行時にORACLEが内部的に作成しているSQLの実行手順です。 どのような実行計画が立てられたとしてもユーザに戻る最終的な結果は全て同じになりますが実行計画によってパフォーマンスは大きく異なります。 ORACLEは統計情報等等から最もパフォーマンスがよいと予測される実行計画を立てようとはしていますが、 遅い実行計画を立てる場合もあるため遅い処理をチューニングする場合はまず最初に実行計画に問題がないか確認する必要があります。

sqlplusでauto traceを設定する

sqlplusにはautotraceコマンドというSQL実行に合わせて実行計画や実行時の統計を取得する機能があり、有効にするとsqlplusの標準出力に実行計画等が表示されるようになります。 autotraceコマンドの使用方法は以下の通りです。

1 plustrce.sqlの実行
plustrce.sqlというスクリプトを実行してauto traceの実行に必要なplustraceロールを作成します。
SQL> CONNECT / AS SYSDBA
SQL> @?/sqlplus/admin/plustrce.sql 
2 auto trace機能を使うユーザに対して権限を追加する
auto trace機能を使うにはPLUSTRACEロールが必要になるため付与します。
SQL> GRANT plustrace TO scott; 
3 auto trace機能を使うユーザに対してPLAN_TABLE表を追加する(~9.2)
9.2までのバージョンの場合実行計画を格納するPLAN_TABLE表を作成します。
SQL> CONNECT scott/tiger
SQL> @?/rdbms/admin/utlxplan.sql 
4 auto traceを設定する
set autotraceコマンドを実行するとsql実行時に実行計画が表示されます。autotraceには以下のようなオプションがあります。

SQLを実際に実行し、実行計画・統計・実行結果を出力する
SET AUTOTRACE ON

SQLを実際に実行するが、結果は表示せずに実行計画・統計は表示する
SET AUTOTRACE TRACEONLY

SQLを実際に実行するが、実行計画は表示せず実行統計と実行結果を表示する
SET AUTOTRACE ON STATISTICS

クエリ(SELECT)は実行せず実行計画のみ表示する(DMLは実行される)
SET AUTOTRACE TRACEONLY EXPLAIN

トレース出力を無効にする
SET AUTOTRACE OFF

出力例
SQL> set autotrace on
SQL> select emp.empno,emp.ename,emp.deptno,dept.dname from emp ,dept where emp.deptno=dept.deptno;

     EMPNO ENAME                    DEPTNO DNAME
---------- -------------------- ---------- ----------------------------
      7839 KING                         10 ACCOUNTING
      7782 CLARK                        10 ACCOUNTING
      7934 MILLER                       10 ACCOUNTING
      7902 FORD                         20 RESEARCH
      7369 SMITH                        20 RESEARCH
      7566 JONES                        20 RESEARCH
      7900 JAMES                        30 SALES
      7844 TURNER                       30 SALES
      7654 MARTIN                       30 SALES
      7521 WARD                         30 SALES
      7499 ALLEN                        30 SALES
      7698 BLAKE                        30 SALES

12行が選択されました。


実行計画
----------------------------------------------------------
Plan hash value: 844388907

----------------------------------------------------------------------------------------
| Id  | Operation                    | Name    | Rows  | Bytes | Cost (%CPU)| Time     |
----------------------------------------------------------------------------------------
|   0 | SELECT STATEMENT             |         |    12 |   312 |     6  (17)| 00:00:01 |
|   1 |  MERGE JOIN                  |         |    12 |   312 |     6  (17)| 00:00:01 |
|   2 |   TABLE ACCESS BY INDEX ROWID| DEPT    |     4 |    52 |     2   (0)| 00:00:01 |
|   3 |    INDEX FULL SCAN           | PK_DEPT |     4 |       |     1   (0)| 00:00:01 |
|*  4 |   SORT JOIN                  |         |    12 |   156 |     4  (25)| 00:00:01 |
|   5 |    TABLE ACCESS FULL         | EMP     |    12 |   156 |     3   (0)| 00:00:01 |
----------------------------------------------------------------------------------------

Predicate Information (identified by operation id):
---------------------------------------------------

   4 - access("EMP"."DEPTNO"="DEPT"."DEPTNO")
       filter("EMP"."DEPTNO"="DEPT"."DEPTNO")


統計
----------------------------------------------------------
          0  recursive calls
          0  db block gets
         11  consistent gets
          0  physical reads
          0  redo size
       1038  bytes sent via SQL*Net to client
        524  bytes received via SQL*Net from client
          2  SQL*Net roundtrips to/from client
          1  sorts (memory)
          0  sorts (disk)
         12  rows processed

SQLトレースを設定する

SQLトレースを設定するとSQLを実行したプロセスのトレースファイルにSQLトレースが出力され、出力されたSQLトレースをさらにtkprofというツールで変換することで人間の目で見やすい形の実行計画に変換することができます。 なお、トレースファイルは初期化パラメータuser_dump_destのパスにプロセスのPIDが付与されたファイル名で作成されます。 SQLトレースは特定のセッションまたは全てのセッションに対して設定することができます。

特定のセッションでSQLトレースを有効にする方法
・自身のセッションでSQLトレースを有効にする
有効化
SQL> alter session set sql_trace=true;
無効化
SQL> alter session set sql_trace=false;
・指定したセッションでSQLトレースを有効にする
SQL> conn / as sysdba
※dbms_systemはマニュアルに記載のないPL/SQLパッケージです
有効化
SQL> exec dbms_system.set_sql_trace_in_session(<セッションID>,<シリアル番号>, TRUE);
無効化
SQL> exec dbms_system.set_sql_trace_in_session(<セッションID>,<シリアル番号>, FALSE);
以下は10g以降で使用可能です。DBMS_MONITORはバインド変数や待機イベントの取得有無も設定可能です。
有効化
SQL> exec DBMS_MONITOR.SESSION_TRACE_ENABLE(session_id=><セッションID>,serial_num=><シリアル番号>,waits=>TRUE,binds=>FALSE);
無効化
SQL> exec DBMS_MONITOR.SESSION_TRACE_DISABLE(session_id=><セッションID>,serial_num=><シリアル番号>);
なお、各セッションのセッションIDとシリアル番号はv$sessionより確認します。

全てのセッションでSQLトレースを有効にする方法
・sql_traceパラメータを設定する(10g以降非推奨)
有効化
SQL> alter system set sql_trace=true;
無効化
SQL> alter system set sql_trace=false;
・DBMS_MONITORパッケージを使用する(10g以降で可能)
有効化
SQL> exec DBMS_MONITOR.DATABASE_TRACE_ENABLE;
無効化
SQL> exec DBMS_MONITOR.DATABASE_TRACE_DISABLE;
SQLトレースの設定、出力例
SQL> alter session set sql_trace=true;

セッションが変更されました。

SQL>  select emp.empno,emp.ename,emp.deptno,dept.dname from emp ,dept where emp.deptno=dept.deptno;

     EMPNO ENAME                              DEPTNO DNAME
---------- ------------------------------ ---------- ------------------------------------------
      7782 CLARK                                  10 ACCOUNTING
      7839 KING                                   10 ACCOUNTING
      7934 MILLER                                 10 ACCOUNTING
      7566 JONES                                  20 RESEARCH
      7902 FORD                                   20 RESEARCH
      7876 ADAMS                                  20 RESEARCH
      7369 SMITH                                  20 RESEARCH
      7788 SCOTT                                  20 RESEARCH
      7521 WARD                                   30 SALES
      7844 TURNER                                 30 SALES
      7499 ALLEN                                  30 SALES
      7900 JAMES                                  30 SALES
      7698 BLAKE                                  30 SALES
      7654 MARTIN                                 30 SALES

14行が選択されました。

SQL> alter session set sql_trace=false;

セッションが変更されました。
[ora102@linux1 udump]$ tkprof /app/oracle/admin/ORCL102/udump/orcl102_ora_20127.trc /app/oracle/admin/ORCL102/udump/orcl102_ora_20127.trc.log SYS=NO

TKPROF: Release 10.2.0.4.0 - Production on 火 4月 26 14:40:43 2011

Copyright (c) 1982, 2007, Oracle.  All rights reserved.


[ora102@linux1 udump]$ cat /app/oracle/admin/ORCL102/udump/orcl102_ora_20127.trc.log

TKPROF: Release 10.2.0.4.0 - Production on 火 4月 26 14:40:43 2011

Copyright (c) 1982, 2007, Oracle.  All rights reserved.

Trace file: /app/oracle/admin/ORCL102/udump/orcl102_ora_20127.trc
Sort options: default

********************************************************************************
count    = number of times OCI procedure was executed
cpu      = cpu time in seconds executing
elapsed  = elapsed time in seconds executing
disk     = number of physical reads of buffers from disk
query    = number of buffers gotten for consistent read
current  = number of buffers gotten in current mode (usually for update)
rows     = number of rows processed by the fetch or execute call
********************************************************************************

select emp.empno,emp.ename,emp.deptno,dept.dname
from
 emp ,dept where emp.deptno=dept.deptno


call     count       cpu    elapsed       disk      query    current        rows
------- ------  -------- ---------- ---------- ---------- ----------  ----------
Parse        1      0.01       0.11          0          0          0           0
Execute      1      0.00       0.00          0          0          0           0
Fetch        2      0.00       0.02          8         11          0          14
------- ------  -------- ---------- ---------- ---------- ----------  ----------
total        4      0.01       0.13          8         11          0          14

Misses in library cache during parse: 1
Optimizer mode: ALL_ROWS
Parsing user id: 54

Rows     Row Source Operation
-------  ---------------------------------------------------
     14  MERGE JOIN  (cr=11 pr=8 pw=0 time=20510 us)
      4   TABLE ACCESS BY INDEX ROWID DEPT (cr=4 pr=2 pw=0 time=10869 us)
      4    INDEX FULL SCAN PK_DEPT (cr=2 pr=1 pw=0 time=10568 us)(object id 51147)
     14   SORT JOIN (cr=7 pr=6 pw=0 time=9747 us)
     14    TABLE ACCESS FULL EMP (cr=7 pr=6 pw=0 time=9677 us)

********************************************************************************

alter session set sql_trace=false


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        0      0.00       0.00          0          0          0           0
------- ------  -------- ---------- ---------- ---------- ----------  ----------
total        2      0.00       0.00          0          0          0           0

Misses in library cache during parse: 0
Parsing user id: 54



********************************************************************************

OVERALL TOTALS FOR ALL NON-RECURSIVE STATEMENTS

call     count       cpu    elapsed       disk      query    current        rows
------- ------  -------- ---------- ---------- ---------- ----------  ----------
Parse        2      0.01       0.11          0          0          0           0
Execute      2      0.00       0.00          0          0          0           0
Fetch        2      0.00       0.02          8         11          0          14
------- ------  -------- ---------- ---------- ---------- ----------  ----------
total        6      0.01       0.13          8         11          0          14

Misses in library cache during parse: 1


OVERALL TOTALS FOR ALL RECURSIVE STATEMENTS

call     count       cpu    elapsed       disk      query    current        rows
------- ------  -------- ---------- ---------- ---------- ----------  ----------
Parse       17      0.01       0.01          0          0          0           0
Execute    140      0.04       0.06          0          0          0           0
Fetch      162      0.00       0.03         17        439          0         787
------- ------  -------- ---------- ---------- ---------- ----------  ----------
total      319      0.07       0.11         17        439          0         787

Misses in library cache during parse: 14
Misses in library cache during execute: 14

    2  user  SQL statements in session.
  140  internal SQL statements in session.
  142  SQL statements in session.
********************************************************************************
Trace file: /app/oracle/admin/ORCL102/udump/orcl102_ora_20127.trc
Trace file compatibility: 10.01.00
Sort options: default

       1  session in tracefile.
       2  user  SQL statements in trace file.
     140  internal SQL statements in trace file.
     142  SQL statements in trace file.
      16  unique SQL statements in trace file.
    1241  lines in trace file.
      12  elapsed seconds in trace file.

explain plan文を実行する

explain plan文を実行することで指定したSQL文の実行計画をplan_table等の表に格納することができます。
explain plan文の使用方法は以下の通りです。

1 explain plan文を実行するユーザに対してPLAN_TABLE表を追加する(~9.2)
9.2までのバージョンの場合実行計画を格納するPLAN_TABLE表を作成します。
SQL> CONNECT scott/tiger
SQL> @?/rdbms/admin/utlxplan.sql 
2 explain plan文を実行する
SQL> explain plan for select * from emp;

解析されました。
3 plan_tableから実行計画を取り出す
plan_tableに格納されたデータはそのまま表示しても見づらいためDBMS_XPLANパッケージを使って整形して表示します。
	
SQL> select * from table(DBMS_XPLAN.DISPLAY());

PLAN_TABLE_OUTPUT
--------------------------------------------------------------------------------------------------------------------------------------------
------------------------------------------------------------
Plan hash value: 3956160932

--------------------------------------------------------------------------
| Id  | Operation         | Name | Rows  | Bytes | Cost (%CPU)| Time     |
--------------------------------------------------------------------------
|   0 | SELECT STATEMENT  |      |    12 |   468 |     3   (0)| 00:00:01 |
|   1 |  TABLE ACCESS FULL| EMP  |    12 |   468 |     3   (0)| 00:00:01 |
--------------------------------------------------------------------------

8行が選択されました。

動的パフォーマンスビューから確認する(9i~)

9i以降のバージョンでは解析された実行計画をV$SQL_PLANから確認することができます。ただし、実行計画は共有プールに保存されているため解析情報はエージアウトされる場合があります。

1 SQLのSQLID(10g~)またはSQL_ADDRESS、SQL_HASHを確認する
SQL> column sql_text format a50
SQL> SELECT ADDRESS,HASH_VALUE,SQL_TEXT FROM V$SQL WHERE SQL_TEXT LIKE 'select% from test%';

ADDRESS  HASH_VALUE SQL_TEXT
-------- ---------- --------------------------------------------------
1CADE4EC  171085072 select * from test
2 V$SQL_PLANを確認する
SQL> column operation format a30
SQL> column object_name format a20
SQL> SELECT A.ID, LPAD(' ',2*(DEPTH-1)) || A.OPERATION || nvl2(OPTIMIZER,'(' || OPTIMIZER || ')',NULL) || nvl2(A.OPTIONS,' ' || 
A.OPTIONS ,NULL) OPERATION, A.OBJECT_NAME,A.BYTES,A.COST,A.CPU_COST,A.IO_COST,A.CARDINALITY FROM V$SQL_PLAN A 
WHERE A.ADDRESS='1CADE4EC' AND A.HASH_VALUE='171085072' AND A.CHILD_NUMBER=0  ORDER BY ID;

        ID OPERATION                      OBJECT_NAME               BYTES       COST   CPU_COST    IO_COST CARDINALITY
---------- ------------------------------ -------------------- ---------- ---------- ---------- ---------- -----------
         0 SELECT STATEMENT(CHOOSE)                                                2
         1 TABLE ACCESS(ANALYZED) FULL    TEST                          3          2                     2       1

マニュアル

パフォーマンス・チューニング・ガイド10gリリース2(10.2)
PL/SQLパッケージ・プロシージャおよびタイプ・リファレンス10g リリース2(10.2)
SQLリファレンス10g リリース2(10.2)
リファレンス10g リリース2(10.2)
カスタム検索

★ORACLE案件承ります★