各ヒープリレーションは、どのページがすべての実行中のトランザクションから可視であることが分かっているタプルだけを含むかを追跡する、可視性マップ(VM)を持ちます。どのページが凍結状態のタプルだけを含むのかも追跡します。
これは、リレーションのファイルノード番号に_vm
という接尾辞を付与した名前の別のリレーションフォーク内に主リレーションデータと並行して格納されます。
例えばリレーションのファイルノードが12345の場合、VMは主リレーションファイルと同じディレクトリ内の12345_vm
というファイル内に格納されます。
インデックスはVMを持たないことに注意してください。
可視性マップはヒープページ当たり2ビットを保持します。 最初のビットがセットされていれば、ページはすべて可視であること、すなわち、そのページにはバキュームが必要なタプルをまったく含んでいないことを示しています。 またこの情報は、インデックスタプルのみを使用して問い合わせに答えるためにインデックスオンリースキャンによっても使用されます。 2番目のビットがセットされていれば、そのページのタプルはすべて凍結状態であることを意味します。 これは、周回対策のバキュームすらそのページを再び訪れる必要はないことを意味します。
このマップは、ビットがセットされている時は常にこの条件が真であることを確実に把握できるという点で保守的ですが、ビットがセットされていない場合は、真かもしれませんし偽かもしれません。 可視性マップのビットはバキュームによってのみで設定されます。 しかしページに対する任意のデータ編集操作によってクリアされます。
pg_visibilityモジュールは可視性マップに入っている情報を確かめるのに使えます。