每个堆关系都有一个可见性映射(VM),用于跟踪哪些页面只包含已知对所有
活动事务可见的元组;它还跟踪哪些页面只包含已冻结的元组。它与主关系数据
一起存储在一个单独的关系 fork 中,该 fork 以关系的 filenode 号加上一个
_vm 后缀命名。例如,如果关系的 filenode 是
12345,VM 就存储在一个名为 12345_vm
的文件中,与主关系文件位于同一目录。
注意,索引没有 VM。
可见性映射为每个堆页面存储两个位。第一个位如果被置位,表示该页面是 全可见的,换句话说,该页面不包含任何需要被清理的元组。 仅索引扫描 也可以利用这一信息,仅用索引元组来回答查询。 第二个位如果被置位,表示该页面上的所有元组都已被冻结。 这意味着即使是防回卷清理也不必再访问该页面。
该映射是保守的,也就是说我们确保只要某个位被置位,条件就一定为真;但 如果位未被置位,条件可能为真也可能不为真。可见性映射的位只由清理 (vacuum)设置,但会被页面上的任何数据修改操作清除。
pg_visibility 模块可用于检查 存储在可见性映射中的信息。