Oracle SQLチューニングの基本は実行計画を理解することです。実行計画はツリー構造で、様々なオペレーションから構成されます。
この記事では、INDEX SKIP SCANオペレーションについて説明します。
INDEX SKIP SCANオペレーションとはどのようなオペレーションか?
クエリで参照する列が、複数列索引(コンポジット索引)の先頭列でない場合でも、索引を使用する実行計画で見られるオペレーションです。
複数列索引の先頭列の値の種類が少ない場合によく選択されます。
実行計画の例と処理イメージ図
SELECT c1, c2 FROM tab0 WHERE c2 = 100;
---------------------------------------------------------------------------------------
| Id | Operation | Name | Rows | Bytes | Cost (%CPU)| Time |
---------------------------------------------------------------------------------------
| 0 | SELECT STATEMENT | | 2 | 12 | 7 (0)| 00:00:01 |
| 1 | TABLE ACCESS BY INDEX ROWID| TAB0 | 2 | 12 | 7 (0)| 00:00:01 |
|* 2 | INDEX SKIP SCAN | T0_IDX3 | 2 | | 5 (0)| 00:00:01 |
---------------------------------------------------------------------------------------
2 - access("C2"=100)
filter("C2"=100)
複数列索引の先頭列であるc1の値の種類が、’A’と’B’の2種類だけの場合、複数列索引は、概念的にはc1=’A’の索引(サブ索引)とc1=’B’の索引(サブ索引)が結合したように考えられます。
INDEX SKIP SCANオペレーションは、サブ索引ごとにINDEX RANGE SCANを行うようなイメージで捉えることができます。
索引を辿るときに、先頭列を無視する(「スキップ」する)ことから、INDEX “SKIP” SCANと呼ばれます。
INDEX SKIP SCANオペレーションに関するFAQ
INDEX SKIP SCANオペレーションが使われる条件には何がありますか?
以下の条件を満たす必要があります。
- 問合せで参照している列が、索引列の先頭以外に含まれること
また、以下の条件を満たしていると、INDEX SKIP SCANオペレーションが使われやすいです。
- 索引の先頭列の値の種類が少ないこと(NDV:Number of Distinct Valuesが小さいこと)
INDEX SKIP SCANオペレーションを使う実行計画は望ましくないですか?
INDEX SKIP SCANオペレーションの実体はINDEX RANGE SCANオペレーションです。INDEX RANGE SCANオペレーションと同様に、テーブルに格納されたデータの件数が多く、そのテーブルから読み出すデータが大量の場合は、INDEX SKIP SCANオペレーションを使う実行計画は望ましくありません。
TABLE FULL ACCESSオペレーションなどの索引を用いたアクセスを行う実行計画になるようにSQLチューニングを行うと、性能が改善される可能があります。
INDEX SKIP SCANオペレーションを使う実行計画に誘導するヒントは何ですか?
INDEX_SSヒントです。
以下にINDEX_SSヒントを指定したSELECT文の例を示します。
-- 特定の索引を使用したINDEX SKIP SCANを指示する場合
SELECT /*+ INDEX_SS(<TABLE_NAME> <INDEX_NAME>) */ FROM ...
-- 索引を使用したINDEX SKIP SCANを指示し、どの索引を使用するかは指示しない場合
SELECT /*+ INDEX_SS(<TABLE_NAME>) */ FROM ...
INDEX_SSヒントを指定してもINDEX SKIP SCANオペレーションが使用されません
検索列が索引列の非先頭列でない場合があります。
INDEX SKIP SCANオペレーションを使用するには、検索列が索引列の先頭以外に含まれる必要があります。
参考情報
キーワード
索引アクセス INDEX RANGE SCAN INDEX SKIP SCAN 索引レンジ・スキャン