PostgreSQL 中文参考文档
🌐 英文原版 官方 ↗

F.36. pg_visibility — 可见性映射信息与实用工具 #

F.36.1. 函数
F.36.2. 作者

pg_visibility 模块提供检查表的可见性映射(VM)与页面级可见性信息的手段。它还提供检查可见性映射完整性以及强制重建可见性映射的函数。

存储页面级可见性信息使用了三个不同的位。可见性映射中的全可见位表示关系中对应页面的每个元组对所有当前与未来事务都可见。可见性映射中的全冻结位表示页面中的每个元组都已被冻结;也就是说,在该页面上有元组被插入、更新、删除或加锁之前,未来的清理操作无需再修改该页面。页面头部的 PD_ALL_VISIBLE 位与可见性映射中的全可见位含义相同,但它存储在数据页自身中,存储在独立的数据结构中。这两个位通常一致,但在崩溃恢复之后,页面的全可见位有时可能在可见性映射位被清除的情况下被置位。pg_visibility 先检查可见性映射、再检查数据页面,两者之间发生的变更也会导致报告的值不一致。任何导致数据损坏的事件同样会造成这两个位不一致。

显示 PD_ALL_VISIBLE 位信息的函数比只查询可见性映射的函数代价高得多,因为它们必须读取关系的数据块,仅仅读取(小得多的)可见性映射。检查关系数据块的函数同样代价高昂。

F.36.1. 函数 #

pg_visibility_map(relation regclass, blkno bigint, all_visible OUT boolean, all_frozen OUT boolean) returns record

返回给定关系指定块在可见性映射中的全可见位与全冻结位。

pg_visibility(relation regclass, blkno bigint, all_visible OUT boolean, all_frozen OUT boolean, pd_all_visible OUT boolean) returns record

返回给定关系指定块在可见性映射中的全可见位与全冻结位,外加该块的 PD_ALL_VISIBLE 位。

pg_visibility_map(relation regclass, blkno OUT bigint, all_visible OUT boolean, all_frozen OUT boolean) returns setof record

返回给定关系每个块在可见性映射中的全可见位与全冻结位。

pg_visibility(relation regclass, blkno OUT bigint, all_visible OUT boolean, all_frozen OUT boolean, pd_all_visible OUT boolean) returns setof record

返回给定关系每个块在可见性映射中的全可见位与全冻结位,外加每个块的 PD_ALL_VISIBLE 位。

pg_visibility_map_summary(relation regclass, all_visible OUT bigint, all_frozen OUT bigint) returns record

根据可见性映射返回关系中的全可见页面数与全冻结页面数。

pg_check_frozen(relation regclass, t_ctid OUT tid) returns setof tid

返回存储在可见性映射中被标记为全冻结的页面里的非冻结元组的 TID。如果该函数返回非空的 TID 集合,则说明可见性映射已损坏。

pg_check_visible(relation regclass, t_ctid OUT tid) returns setof tid

返回存储在可见性映射中被标记为全可见的页面里的非全可见元组的 TID。如果该函数返回非空的 TID 集合,则说明可见性映射已损坏。

pg_truncate_visibility_map(relation regclass) returns void

截断给定关系的可见性映射。如果你认为该关系的可见性映射已损坏并希望强制重建它,这个函数会很有用。执行该函数之后,对该关系执行的第一次 VACUUM 将扫描关系中的每个页面并重建可见性映射。(在此之前,查询会将可见性映射视为全零。)

默认情况下,这些函数只有超级用户和拥有 pg_stat_scan_tables 角色特权的角色可以执行;pg_truncate_visibility_map(relation regclass) 例外,它只能由超级用户执行。

F.36.2. 作者 #

Robert Haas