Oracle で SQL の実行計画からインデックス使用の有無を調べる
2009-8-3 18:00
Oracle である問い合わせのクエリが、インデックスを使っているかどうか確認するときの方法です。よく知られているものですがツールが無くて SQL*Plus だけで対応しなければならないとき用にメモしておきます。
1. PLAN_TABLE 表を作成
初回のみこの作業が必要になります。SQL*Plus でDBに接続し utlxplan.sql ファイルを実行します。
SQL> @%ORACLE_HOME%\rdbms\admin\utlxplan.sql
Oracle クライアントのインストールオプションによっては、このファイルは存在しないかもしれません。管理者インストールならおそらく入っていると思います。utlxplan.sql 既に PLAN_TABLE が作成されていればこの作業は不要です。
2. EXPLAIN PLAN FOR SELECT ~ で実行計画を取得
実行計画を調べたい問い合わせ文の SQL に “EXPLAIN PLAN FOR ” を付加して実行します。
SQL> EXPLAIN PLAN FOR SELECT * FROM employee WHERE id = 100; 解析されました。
3.取得した実行計画を表示
utlxpls.sql ファイルを実行します。
SQL> @%ORACLE_HOME%\rdbms\admin\utlxpls.sql PLAN_TABLE_OUT_PUT | TABLE ACCESS BY INDEX ROWID | employee | 1 | 27 | | INDEX UNIQUE SCAN | pk_employee | 1 | |
この結果で、INDEX UNIQUE SCAN があれば、問い合わせにはユニークスキャンが行なわれ1行取得していることがわかります。
PLAN_TABLE_OUT_PUT | TABLE ACCESS FULL | employee | | |
上記のように表示されるときは、インデックスは使われていないことが分かります。
実行計画の削除
取得した実行計画の解析結果が不要になったら、PLAN_TABLE を切り捨てておきます。
SQL> TRUNCATE TABLE plan_table;
コメントはまだありません
No comments yet.
Sorry, the comment form is closed at this time.