|
|
|
|
実行計画の取得(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」と太字にしてある箇所
スポンサード リンク
|
|
|
|
|