2025年9月25日: PostgreSQL 18 发布!
支持的版本:当前18)/ 17 / 16 / 15 / 14 / 13
开发版本:devel
不支持的版本:12 / 11 / 10 / 9.6

F.36. pg_visibility — 可见性映射信息和工具 #

pg_visibility 模块提供了一种检查表的可视性映射 (VM) 和页面级别可见性信息的方法。它还提供了用于检查可见性映射的完整性以及强制重建它的函数。

有三个不同的位用于存储关于页面级别可见性的信息。可见性映射中的 all-visible 位表示关系对应页面中的每个元组对所有当前和未来的事务都可见。可见性映射中的 all-frozen 位表示页面中的每个元组都已冻结;也就是说,在向该页面插入、更新、删除或锁定元组之前,不需要进行未来的 vacuum 操作来修改该页面。页面头中的 PD_ALL_VISIBLE 位与可见性映射中的 all-visible 位具有相同的含义,但它存储在数据页面本身而不是单独的数据结构中。这两个位通常是同步的,但在一处崩溃恢复后,页面的 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

返回给定关系给定块在可见性映射中的 all-visible 和 all-frozen 位。

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

返回给定关系给定块在可见性映射中的 all-visible 和 all-frozen 位,以及该块的 PD_ALL_VISIBLE 位。

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

返回给定关系每个块在可见性映射中的 all-visible 和 all-frozen 位。

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

返回给定关系每个块在可见性映射中的 all-visible 和 all-frozen 位,以及每个块的 PD_ALL_VISIBLE 位。

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

根据可见性映射返回关系中 all-visible 页面和 all-frozen 页面的数量。

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

返回存储在可见性映射中标记为 all-frozen 的页面中的非冻结元组的 TID。如果此函数返回非空 TID 集,则可见性映射已损坏。

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

返回存储在可见性映射中标记为 all-visible 的页面中的非 all-visible 元组的 TID。如果此函数返回非空 TID 集,则可见性映射已损坏。

pg_truncate_visibility_map(relation regclass) returns void

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

默认情况下,除 pg_truncate_visibility_map(relation regclass)(只能由超级用户执行)之外,这些函数只能由超级用户和具有 pg_stat_scan_tables 角色的用户执行。

F.36.2. 作者 #

Robert Haas

提交更正

如果您在文档中看到任何不正确、不符合您对特定功能的体验或需要进一步澄清的内容,请使用此表格报告文档问题。