【びっとまっぷいんでっくす】

ビットマップインデックス とは?

最終更新:
💡 0と1のチェック表を重ねて、条件に合う行を探す索引

列の値ごとに、どの行が該当するかを0と1のビット列で表す索引。ビット演算で複数の検索条件を組み合わせられ、分析用途などで使われる。

📌 このページのポイント
ビット列を重ねて、行を絞り込む 同じ列位置が、同じ行に対応 注文の条件 行1 行2 行3 行4 行5 発送済み 1 0 1 0 1 東京 1 1 0 0 1 ANDの結果 1 0 0 0 1 両方とも1の位置を残す 該当するのは、行1と行5
発送済み10101と東京11001のANDは10001。左右のビット位置は行番号に対応する。
ひよこ ひよこ
ビットマップインデックスって、普通のインデックスと何が違うの?
ペンギン先生 ペンギン先生
B-tree索引はキーを順序付きの木で管理するけど、ビットマップ索引は値ごとの該当行をビット列で表すんだ。たとえば5行の注文で『発送済み』が1・3・5行目なら、ビット列は10101になるよ。
ひよこ ひよこ
そのチェック表をどう使うの?
ペンギン先生 ペンギン先生
『東京』の行が1・2・5行目なら11001。発送済みの10101とANDを取ると10001だから、両方に当てはまる1・5行目が分かるね。ORなら、どちらかの条件に合う行を集められるよ。
ひよこ ひよこ
じゃあ全部の列に使えばいい?
ペンギン先生 ペンギン先生
値の種類が少なく、読み取り中心の列が代表的な候補だよ。ほぼ全行で値が異なる列はB-treeの方が適する場合がある。索引の圧縮方法やデータの分布、実際の検索条件も比べて選ぶんだ。
ひよこ ひよこ
どんなシステムで使われるの?
ペンギン先生 ペンギン先生
Oracle Databaseにはこの索引があり、データウェアハウスの分析などで使われるよ。複数条件をビット列で絞り込んでから必要な行にアクセスできる。ただし、何百万行でも必ず一瞬で終わるという保証はないんだ。
ひよこ ひよこ
更新が多いと困るの?
ペンギン先生 ペンギン先生
Oracleでは更新した行のビットだけでなく、複数行に対応する索引エントリをロックするため、同時更新が競合しやすいんだ。どの実装でも『全ビット列を丸ごと書き換える』わけではないよ。更新頻度や同時実行も含めて判断するんだね。
ペンギン
まとめ:ざっくりこれだけ覚えればOK!
「ビットマップインデックス」って出てきたら「行の該当・非該当をビット列にして検索する索引」と思えばだいたいOK!
📖 おまけ:英語の意味
「Bitmap Index」 = ビットマップ索引
💬 Bitmap(ビットの地図)をインデックスに使うから、そのままの名前だよ

参考資料

← 用語集にもどる