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


112

「ビットマップヒープスキャン」の原理を知りたいのですORが、条件内でクエリを実行すると、これが頻繁に発生します。

「ビットマップヒープスキャン」の原理を説明できるのは誰ですか。

回答:


121

最良の説明は私が誤解していない限り、アルゴリズムの作者であるTom Laneからのものです。ウィキペディアの記事もご覧ください。

つまり、seqスキャンに少し似ています。違いは、ビットマップインデックスは、すべてのディスクページにアクセスするのではなく、ANDとORの該当するインデックスをスキャンし、必要なディスクページにのみアクセスすることです。

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


再:あなたのコメントの質問...うん、それはまさにそれです。

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

ビットマップインデックススキャンは、ディスクページの短いリストを順次開き、それぞれの該当するすべての行を取得します(そのため、クエリプランに表示される、いわゆるrecheck condと呼ばれます)。

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


したがって、「ビットマップヒープスキャン」:ページに複数回アクセスすることはできません。しかし、「インデックスはできます」:インデックスは行ごとに順番にアクセスされるため、ページに複数回アクセスできます。
フラン

ページが複数回アクセスされる場合、おそらくキャッシュが関係しています。ページは実際には最初にディスクからロードされ(低速)、さらにアクセスするとメモリ内のキャッシュにヒットします(Postgresキャッシュ(高速)またはOSキャッシュ(高速))。 。
Matthieu 2018

またindex-only scan、クエリでインデックス付きの列のみにアクセスする場合もあります。この場合、index-only scanヒープ(データページ)データにアクセスする必要はありません:postgresql.org/docs/12/indexes-index-only-scans.html
アラン
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.