回答:
最良の説明は、私が誤解していない限り、アルゴリズムの作者であるTom Laneからのものです。ウィキペディアの記事もご覧ください。
つまり、seqスキャンに少し似ています。違いは、ビットマップインデックスは、すべてのディスクページにアクセスするのではなく、ANDとORの該当するインデックスをスキャンし、必要なディスクページにのみアクセスすることです。
これは、インデックスが行ごとに順番にアクセスされるインデックススキャンとは異なります。つまり、ディスクページが複数回アクセスされる可能性があります。
再:あなたのコメントの質問...うん、それはまさにそれです。
インデックススキャンは行を1つずつ処理して、ディスクページを必要な回数だけ何度も開きます(もちろん、一部はメモリ内に残りますが、要点はわかります)。
ビットマップインデックススキャンは、ディスクページの短いリストを順次開き、それぞれの該当するすべての行を取得します(そのため、クエリプランに表示される、いわゆるrecheck condと呼ばれます)。
余談ですが、クラスタリング/行の順序がいずれかの方法で関連するコストにどのように影響するかに注意してください。行がランダムな順序でその場所全体にある場合、ビットマップインデックスの方が安価です。(彼らは本当にしている場合と、実際には、すべての場所の上にビットマップ・インデックス・スキャンは、いくつかのオーバーヘッドがないわけではないため、配列スキャンは、最も安いなります。)
index-only scan
、クエリでインデックス付きの列のみにアクセスする場合もあります。この場合、index-only scan
ヒープ(データページ)データにアクセスする必要はありません:postgresql.org/docs/12/indexes-index-only-scans.html