每个堆关系都有一个可见性图 (VM),以跟踪包含哪些只有所有活动事务都可见的元组的页面;它还跟踪哪些页面仅包含冻结元组。它与主关系数据一起存储在一个单独的关系分支中,该分支以该关系的文件节点号和 _vm
后缀命名。例如,如果一个关系的文件节点为 12345,则 VM 存储在一个名为 12345_vm
的文件中,与主关系文件位于同一目录中。请注意,索引没有 VM。
可见性映射表中每个堆页存储两位。如果已设置第一位,则表示页面完全可见,即页面中不包含需要清理的元组。此信息也可由仅索引扫描使用,目的仅通过索引元组查询来回答查询。如果已设置第二位,则表示页面上的所有元组都已冻结。这意味着,即使进行反向环绕清理也无需再次访问页面。
从某种意义上来说,映射表是保守的,因为如果已设置某位,我们确定此条件为真,但如果未设置某位,则此条件可能为真或假。可见性映射位仅通过清理进行设置,但可以通过页面上的任何数据修改操作清除。
pg_visibility模块可用来检查可见性映射表中存储的信息。