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.

32 queries. HTML convert time: 0.231 sec. Powered by WordPress. Valid XHTML
Copyright © 2003-2017 @ futuremix.org ログイン