- B-Treeインデックス(以降インデックス)を使うと読取るデータブロック数が減るので速くなる。
- 全件検索はインデックスを使うと遅い。全表走査より読取るブロック数が増え、さらにランダムアクセスになるから。
- インデックスはスカスカになると遅くなる。遅くなるのは範囲検索。イコール検索は遅くならない。イコール検索だと読取るブロック数が変わらないから。
- インデックスがスカスカになる原因
- リーフ分割: キーの更新/追加
- データ削除: レコードの削除
- ダメになったインデックスは再作成しないと直らない。
- 統計情報を収集しておくとマシ。CBOが全表走査のほうが速いと判断してインデックスを使わなかったりする。
- コンポジットインデックスは検索時にインデックスの最初に指定したカラムが使われなければ全表走査になる。
- ビットマップインデックスはビットマップセグメント単位(複数行)でロックされるため同時実行性が悪い。同じキー値の行が全てロックされる。OLTP系システムには向かない。DWH系システム向け。
インデックスじゃなくて全表走査の場合でも、HWMが上がれば遅くなる。目的のデータを取得するために読み出すブロック数が多くなると遅くなる。要するに、読取るデータブロック数、ディスクのシーク回数が少ないほうが速い。それを判断するのがCBO。CBOの判断材料が統計情報。だから統計情報がデタラメだとCBOが判断ミスをする。
[参考]
おら!オラ!オラクル 1章 インデックスをダメにする