web-dev-qa-db-ja.com

クエリプランの「ビットマップヒープスキャン」とは何ですか?

「ビットマップヒープスキャン」の原理を知りたいです。これは、条件にORを指定してクエリを実行するとよく起こることです。

「ビットマップヒープスキャン」の背後にある原理を誰が説明できますか?

96
francs

最良の説明は Tom Laneから です。これは、私が間違えない限り、アルゴリズムの作成者です。 wikipedia article もご覧ください。

要するに、これはseqスキャンに少し似ています。違いは、すべてのディスクページを訪問するのではなく、ビットマップインデックスが適用可能なインデックスをANDおよびORで一緒にスキャンし、必要なディスクページのみを訪問することです。

これは、インデックスが行ごとに順番にアクセスされるインデックススキャンとは異なります。つまり、ディスクページが複数回アクセスされる場合があります。


再:あなたのコメントの質問...うん、それだけです。

インデックススキャンは、行を1つずつ実行し、必要に応じて何度でもディスクページを開きます(もちろん、一部はメモリに残りますが、ポイントを取得します)。

ビットマップインデックススキャンは、ディスクページの短いリストを順番に開き、各ページの該当するすべての行を取得します(そのため、クエリプランで表示されるいわゆる再チェック条件)。

余談ですが、どちらの方法でも、クラスタリング/行の順序が関連コストにどのように影響するかに注意してください。行がランダムな順序ですべての場所にある場合、ビットマップインデックスは安価になります。 (実際、それらが実際にallである場合、ビットマップインデックススキャンにはいくつかの機能がないため、seqスキャンは最も安価です。オーバーヘッド。)

113