ORACLE SQL リファレンス(逆引き)

ORACLE SQL リファレンス

Web oracle.se-free.com
実行計画の取得(EXPLAIN PLAN)
スポンサード リンク

SQLの詳細な実行計画を取得するには、EXPLAINコマンドを使用します。

(1)表「PLAN_TABLE」を生成する。
SQLを実行するユーザでDB接続し、下記のように「utlxplan.sql」を実行する。
既に、表「PLAN_TABLE」が作成されている場合はこの処理は不要

 SQL> @%ORACLE%\rdbms\admin\utlcplan.sql

(2)EXPLAIN PLANコマンドを実行し、実行計画を取得する。
下記のように、FOR以降に実行計画を取得するSQL文指定する。

 SQL> explain plan for select * from emp where emp_id = 'E01';

(3)取得した実行計画を表示する。
下記のように「utlxpls.sql」を実行して、(2)で「PLAN_TABLE」に格納された実行計画を見やすい形式に整形して表示する。

 SQL> @%ORACLE_HOME%\rdbms\admin\utlxpls.sql

(4)取得した実行計画が不要になったら削除する。

 SQL> trancate table plan_table;



例1)表「PLAN_TABLE」を生成する。

SQL> @C:\oracle\product\10.2.0\db_1\RDBMS\ADMIN\UTLXPLAN.SQL

表が作成されました。

SQL>


スポンサード リンク


例2)SQL「select * from emp where emp_id = 'E01';」の実行計画を取得する。
   インデックス項目「emp_id」を検索キーとしている。
SQL> explain plan for
 2   select * from emp where emp_id = 'E01';

解析されました。

SQL>
SQL> @C:\oracle\product\10.2.0\db_1\RDBMS\ADMIN\UTLXPLS.SQL

PLAN_TABLE_OUTPUT
-------------------------------------------------------------
Plan hash value: 3259448168

-------------------------------------------------------------------------------
| Id | Operation                 | Name      | Rows | Bytes | Cost (%CPU)| Time   |
-------------------------------------------------------------------------------
| 0 | SELECT STATEMENT         |          |   1 |   17 |      1 (0)| 00:00:01 |
| 1 | TABLE ACCESS BY INDEX ROWID| EMP      |   1 |   17 |      1 (0)| 00:00:01 |
|* 2 |  INDEX UNIQUE SCAN      | SYS_C005431|   1 |      |      0 (0)| 00:00:01 |
-------------------------------------------------------------------------------

PLAN_TABLE_OUTPUT
-------------------------------------------------------------------------------

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

2 - access("EMP_ID"='E01')
インデックス項目「emp_id」を検索キーとしているので、インデックスを使用して検索しているのが分かります。上記実行計画の「INDEX UNIQUE SCAN」と太字にしてある箇所


例3)SQL「select * from emp where dept_id = 'D01';」の実行計画を取得する。
   検索キー項目の「dept_id」はインデックス項目ではないので全表走査となる。
SQL> explain plan for
 2   select * from emp where dept_id = 'D01';

解析されました。

SQL>
SQL> @C:\oracle\product\10.2.0\db_1\RDBMS\ADMIN\UTLXPLS.SQL

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

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

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

PLAN_TABLE_OUTPUT
--------------------------------------------------------------------------

1 - filter("DEPT_ID"='D01')
非インデックス項目「dept_id」を検索キーとしているので、全表走査になっているのが分かります。上記実行計画の「TABLE ACCESS FULL」と太字にしてある箇所

スポンサード リンク


実行計画の取得:8i以前(EXPLAIN PLAN)
実行計画の取得:SQLPLUSのAUTOTRACE( EXPLAIN PLAN )
実行計画の取得:9i以降その1(V$SQL_PLAN)
実行計画の取得:9i以降その2(V$SQL_PLAN_STATISTICS_ALL)
実行計画の取得:SQLトレース、tkprof

SQLチューニングへ
忘れっぽいエンジニアのオラクルSQLリファレンス TOPへ