- 締切済み
INDEX RANGE SCAN とは?
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)
- 専門家の回答
みんなの回答
- utakataXEX
- ベストアンサー率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 になると思います。
- chukenkenkou
- ベストアンサー率43% (833/1926)
複数列でインデクスが構成されている状態で、先頭の列だけ検索条件を指定した場合とか、いろいろあると思いますよ。 インデクス定義や検索条件を具体的に示してもらえれば、もう少し具体的なアドバイスができると思います。
お礼
ありがとうございました。
補足
最初の情報にいくつか間違いがありました。 情報の修正・追記しておきます。 テーブルに対してカラムは10ほどあります。 検索条件に指定していたのは3つのカラムでした(A, B, C)。 カラムAは種類が1000ほどあるカラムです。 カラムBは種類が11しかないカラムです。 カラムCは論理削除のカラムで、値は0, 1しか入らない すなわちカーディナリティ非常に低いカラムです。 A, B 2つを指定する複合インデックスが存在します。 すなわち、非常に適切に思えるインデックスが存在していました。 >複数列でインデクスが構成されている状態で、 >先頭の列だけ検索条件を指定した場合とか、いろいろあると思いますよ。 単独カラムのインデックスの場合には絶対に生じないということでしょうか? 複合インデックスの場合には生じえるのですか? 特に >先頭の列だけ検索条件を指定した場合 この場合になぜINDEX RANGE SCANになってしまうのでしょうか? この点がまさに私の知りたい点だと思います。 この点についてご説明お願いしたいです。よろしくお願いします。
お礼
なんとなくですが理解できました。 ありがとうございました。
補足
>のようなSQLを実行した場合、カラムA自体はカーディナリティが高いと >言っても、ユニークインデックスではないのですから、オプティマイザが >INDEX RANGE SCANを選択するのは自然です。 これを改めて読んでようやくわかったかもしれないので確認させてください。 ユニークインデックスでは無い場合には必ずINDEX RANGE SCANになるのでしょうか?