2015-10-13 15 views
5

でビットマップ索引をUndestandingのPostgreSQL 9.4 PostgreSQLの

私はちょうどBitmap Index Scanと呼ばれるノードに直面しており、いわゆる基本となるビットマップデータ構造の概念はin this postを述べました。私の知る限り、PostgreSQLはビットマップインデックスの作成をサポートしていません。

質問:だから我々はBitmap Index Scanを実行するために、ビットマップデータ構造を使用する必要がある任意の時間は、我々が最初にそれを構築する必要がありますまたはPostgreSQLがbtreeインデックスの構築時に、それを作成し、それをテーブルのは、変更された時間を再構築?

答えて

21

ページのビットマップは、クエリごとに動的に作成されます。キャッシュされたり再利用されたりせず、ビットマップ索引スキャンの終了時に破棄されます。

の内容がクエリ述語に依存するため、ページビットマップを事前に作成することは意味がありません。

x=1 and y=2を検索しているとします。 xyにbツリーインデックスがあります。 PostgreSQLはxyをビットマップに結合せず、ビットマップを検索します。インデックスxをスキャンして、すべてのページのページアドレスをx=1とし、x=1を含む可能性のあるページが存在するビットマップを作成します。次に、yをスキャンして、y2と等しいかもしれないページアドレスを探し、それからビットマップを作成します。次に、それらをAND30して、x=1y=2の両方が真である可能性のあるページを見つけます。最後に、テーブルを自己走査し、候補値を含む可能性のあるページのみを読み込み、各ページを読み込み、行のみを保持する。x=1 and y=2

キャッシュされたあらかじめ構築されたビットマップインデックスのようなものを探しているなら、PostgreSQL 9.5にはこのようなものがあります:BRIN indexes。これらは非常に大きなテーブルを対象としており、目的の値が含まれていないことがわかっているためスキップできる範囲を見つける方法を提供します。

2

データページのビットマップは、必要に応じて(クエリごとに)インデックス以上のインデックスから作成されます。これは、索引がより少ない行を戻す場合、または同じリレーションに対して2つ以上の索引が使用される場合に使用されます。ビットマップの内容は、どのページを処理し、どのページをスキップするかを制御します。

このスキャン方法の基本的な要件は、テーブル上の既存のインデックスです。

+0

したがって、ビットマップヒープスキャンを実行する必要があるときはいつでも、scratch_構造体を構築します。 –

+0

いいえ、これはユーザーにとって透過的です。 –