1. ホーム
  2. postgresql

[解決済み] クエリプランにおける「ビットマップヒープスキャン」とは何ですか?

2022-04-26 14:57:07

質問

ビットマップヒープスキャンの原理を教えてください。 でクエリを実行した場合 OR を条件とします。

ビットマップヒープスキャン(quot;Bitmap heap scan")の原理を説明できる人はいますか?

どのように解決するのですか?

最適な説明は トム・レーン 私が間違っていなければ、このアルゴリズムの作者である。また ウィキペディアの記事 .

要するに、seqスキャンと同じようなものです。違いは、すべてのディスクページを訪れるのではなく、ビットマップインデックススキャンは該当するインデックスを一緒にANDとORし、必要なディスクページのみを訪問することです。

これはインデックススキャンとは異なり、インデックスを行ごとに順番に訪問するため、ディスクページが複数回訪問される可能性があります。


Re: コメントにある質問について... はい、その通りです。

インデックススキャンは行を1つずつ調べ、必要なだけ何度もディスクページを開きます(もちろん一部はメモリに残りますが、要点はおわかりでしょう)。

ビットマップインデックススキャンは、短いディスクページのリストを順次開き、それぞれのページで該当する行をすべて取得します(そのため、クエリプランで見られるいわゆる再チェックマンションが発生します)。

余談ですが、クラスタリングや行の順番がどちらの方法でも関連するコストに影響を与えることに注意してください。もし行があちこちに散らばっていて、その順番がランダムであれば、ビットマップインデックスの方が安くなります。(そして、実際、もし行が本当に すべて ビットマップインデックススキャンはオーバーヘッドがないわけではないので、seqスキャンが最も安くなります)。