小さい頃はエラ呼吸

いつのまにやら肺で呼吸をしています。


Oracle DBでインデックスを使った検索が行われているかを確認する方法


photo credit: koalazymonkey via photopin cc

はじめに

Oracle DBで任意のテーブルを検索するSQLを実行する際、インデックスを使った高速な検索が行われているか確認する方法を紹介します。

インデックスが効いているか確認する

インデックスを使った検索が行われているかは、set autotrace onを使って、実行計画を出力するとひと目でわかります。

set autotrace on
任意のSQL

set autotraceコマンドで「SP2-0618: セッション識別子が見つかりません。」というメッセージが表示される場合は、以下の記事を参照して設定を有効にしてください。

インデックスを使った検索

プライマリキーを使った検索でインデックスが効くケースです。以下のようなテーブルに対して、WHERE区に主キーを指定して、検索してみます。

create table table01
(
  id char(5),
  name varchar2(50),
  furigana varchar2(50),
  primary key( id )
);
set autotrace on
select * from table01 where id = '1';


上記の例では、INDEX UNIQUE SCANというのが表示されており、SYS_C006997という名前のインデックスを使った検索を実施しているということが分かります。

インデックスが使われていない検索

さきほどと同じようにプライマリキーによる検索ですが、インデックスが使われていないケースです。WHERE区にはプライマリキーを指定していますが、char型の主キーに対して数値を渡しており、暗黙の型変換が行われているため、インデックスが使われていません。

set autotrace on
select * from table01 where id = 1;


上記の例では、TABLE ACCESS FULLというのが表示されており、テーブルのフルスキャンが行われているということが分かります。

おわりに

set autotrace onでSQLの実行計画を出力すると、どのような検索が行われたかを調べることができます。テスト段階で性能問題になる前に実装段階からこまめにチェックするようにしていきたいですね。