PostgreSQL における Index Scan と Bitmap Scan

PostgreSQL の Planner が Index Scan よりも Bitmap Scan を好む理由がやっと分かった。(Tom Lane さんに教えてもらった)。
Bitmap Scan が有利なクエリーはともかく

select * from emp where emp_no > 10000;

のような単純なクエリーでも、Bitmap Scan が選ばれるのが分からなかった。


Bitmap を作ったあとに特に bit 演算せず、そのまま tuple を取得。
一見するとほとんど Index Scan と速度が変わらないように見えるし、むしろ Bitmap を作るだけ損だとも思える。


でも実は Bitmap Scan では tuple を引くときに最適な方法でデータを取得するのだそうだ。
例えば Bitmap を利用して同じページは1度しか読まないとか。


Index Scan では un-clustered なインデックスの場合、同一ページにたくさんの tuple がある場合でも、何回もそのページを読んでしまう可能性があるのでそれに比べて速度的に有利なのだ。


そう考えると、Bitmap Scan は動的な Clustered Index のようなものだと考える事が出来ると思った。(物理的に連続していないので同じものではないけど)