• 締切
  • 暇なときにでも

INDEX RANGE SCAN とは?

  • 質問No.4455744
  • 閲覧数6159
  • ありがとう数3
  • 気になる数0
  • 回答数2
  • コメント数0

お礼率 99% (156/157)

OracleのINDEX RANGE SCANについての質問です。

私の理解のレベルでは、INDEX RANGE SCANは範囲検索をする時に発生し、
それ自体は効率的にインデックスを利用している状態である、と理解しています。
もっといえば、betweenを使用したり演算子に「>=」などの不等号を使用した
とき以外には発生しないはずと思っていました。

しかし先日、条件部分に「=」等号しかないSQLにてINDEX RANGE SCANが発生しました。
INDEX SKIP SCAN ならまだ話はわかるのですが、間違いなくINDEX RANGE SCANでした。

範囲検索で無い場合にINDEX RANGE SCANになる意味がよくわかりません。


■以下質問です。
範囲検索の場合にINDEX RANGE SCANになるという私の認識はあっているか。
どのような場合に、等価条件だけの場合にINDEX RANGE SCANになるのか。
等価条件だけなのにINDEX RANGE SCANになる場合、検索の仕組みについて。


■参考情報として記述しておきます。
バージョンは9iです。
1つのテーブルに対するSELECT文で
where句には4つのカラムが等価条件で指定されています。
これらのカラムは条件・カラムの値ともにNULLではありません。
関係あるかわかりませんが、カーディナリティが高いにもかかわらず
適切なインデックスが無いSQLでした。

よろしくお願いします。

回答 (全2件)

  • 回答No.2

ベストアンサー率 69% (711/1018)

>特に
>>先頭の列だけ検索条件を指定した場合
>
>この場合になぜINDEX RANGE SCANになってしまうのでしょうか?

A |B |C
---------
0001|01|0
0002|01|1
0002|02|1
0003|02|1
0004|02|0
0004|03|0



こんなような感じですよね。
で、アナライズしてあるものと仮定して、

select *
from テーブル
where A = バインド変数1
and B = バインド変数2
and C = バインド変数3

のようなSQLを実行した場合、カラムA自体はカーディナリティが高いと
言っても、ユニークインデックスではないのですから、オプティマイザが
INDEX RANGE SCANを選択するのは自然です。

その値がたまたまユニークになっていてもユニークインデックス
でなければRANGE SCANになります。

A, Bの複合インデックスがユニークインデックスなら INDEX UNIQUE SCAN
になると思います。
補足コメント
mibusys

お礼率 99% (156/157)

>のようなSQLを実行した場合、カラムA自体はカーディナリティが高いと
>言っても、ユニークインデックスではないのですから、オプティマイザが
>INDEX RANGE SCANを選択するのは自然です。

これを改めて読んでようやくわかったかもしれないので確認させてください。
ユニークインデックスでは無い場合には必ずINDEX RANGE SCANになるのでしょうか?
投稿日時:2008/11/28 22:30
お礼コメント
mibusys

お礼率 99% (156/157)

なんとなくですが理解できました。
ありがとうございました。
投稿日時:2008/12/14 09:57
  • 回答No.1

ベストアンサー率 43% (833/1926)

複数列でインデクスが構成されている状態で、先頭の列だけ検索条件を指定した場合とか、いろいろあると思いますよ。

インデクス定義や検索条件を具体的に示してもらえれば、もう少し具体的なアドバイスができると思います。
補足コメント
mibusys

お礼率 99% (156/157)

最初の情報にいくつか間違いがありました。
情報の修正・追記しておきます。


テーブルに対してカラムは10ほどあります。
検索条件に指定していたのは3つのカラムでした(A, B, C)。

カラムAは種類が1000ほどあるカラムです。
カラムBは種類が11しかないカラムです。
カラムCは論理削除のカラムで、値は0, 1しか入らない
すなわちカーディナリティ非常に低いカラムです。

A, B 2つを指定する複合インデックスが存在します。
すなわち、非常に適切に思えるインデックスが存在していました。


>複数列でインデクスが構成されている状態で、
>先頭の列だけ検索条件を指定した場合とか、いろいろあると思いますよ。

単独カラムのインデックスの場合には絶対に生じないということでしょうか?
複合インデックスの場合には生じえるのですか?


特に
>先頭の列だけ検索条件を指定した場合

この場合になぜINDEX RANGE SCANになってしまうのでしょうか?
この点がまさに私の知りたい点だと思います。
この点についてご説明お願いしたいです。よろしくお願いします。
投稿日時:2008/11/05 18:32
お礼コメント
mibusys

お礼率 99% (156/157)

ありがとうございました。
投稿日時:2011/11/06 10:36
結果を報告する
このQ&Aにはまだコメントがありません。
あなたの思ったこと、知っていることをここにコメントしてみましょう。
AIエージェント「あい」

こんにちは。AIエージェントの「あい」です。
あなたの悩みに、OKWAVE 3,600万件のQ&Aを分析して最適な回答をご提案します。

関連するQ&A

その他の関連するQ&Aをキーワードで探す

ピックアップ

ページ先頭へ