0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

SQLパフォーマンス詳解 2章: where句_10.インデックスの結合

Posted at

2章: where句

10.インデックスの結合

1) 問題の本質

  • 複数列の条件があると 単一の B-tree マルチカラム索引 で全てを効率化できない場合がある(特に複数の独立した範囲条件があるとき)
     
  • 事前にクエリパターンを予測できない(=アドホック検索が多い)環境では、最適なマルチカラム索引を用意できない

2) データベースがインデックス結果をまとめる方法

1. インデックス結合(Index Merge / Bitmap AND/OR)

  • 各列のインデックスを個別に走査し、結果(ROWID等)を合成して最終候補を作る
  • 長所:クエリが事前に分からなくても複数インデックスで対処できる
  • 短所:複数インデックス走査+中間結果のマージで CPU・メモリ負荷が高い。OLTPではコストが高くなりがち

2. データウェアハウス流(ビットマップインデックス)

  • 各列にビットマップインデックスを作り、簡単にビット演算で条件を合成できる
  • 長所:複数条件の合成が非常に高速で、アドホック問い合わせに強い
  • 短所:INSERT/UPDATE/DELETE の書き込みコストが極端に大きく、同時書き込みに弱い
    ➡ OLTPには不向き(主にDWH向け)

3) ハイブリッド手法(実行時ビットマップ化)

  • 多くのDBは B-tree スキャン結果を 一時的にメモリ上のビットマップに変換して合成する機能を持つ(永続化しない)
  • 長所:ビットマップの利点を得つつ、ビットマップ索引の書き込み問題は回避できる
  • 短所:メモリとCPUを大量消費するため、オプティマイザの最後の手段的手法

4) 結論

  • クエリパターンが事前に分かる → マルチカラム B-tree インデックス を優先
  • アドホックで多次元の条件が頻出(DWH) → ビットマップインデックス が適切
  • OLTPでアドホックな結合がたまに起きる → DBの インデックス結合一時ビットマップ に頼るが、コストに注意

まとめ

B-tree は1次元(範囲1つ)に強い。複数条件の合成はコストがかかるため、用途(OLTP vs DWH)に応じてマルチカラム索引・ビットマップ・インデックス結合を使い分ける

0
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?