Postgresql 中文操作指南

F.36. pg_visibility — visibility map information and utilities #

pg_visibility 模块提供了一种检查表的可见性地图 (VM) 和页面级别可见性信息的方法。它还提供函数来检查可见性地图的完整性并强制重建它。

三个不同的位用于存储有关页面级可见性的信息。可见性地图中的 all-visible 位表示关系的对应页面中的每个元组对于当前和将来的事务都是可见的。可见性地图中的 all-frozen 位表示页面中的每个元组都被冻结;也就是说,在元组在该页面上被插入、更新、删除或锁定之前,将来的真空不需要修改该页面。页面头的 PD_ALL_VISIBLE 位与可见性地图中的 all-visible 位有相同的含义,但存储在数据页面本身中,而不是存储在单独的数据结构中。这两个位通常会一致,但有时在崩溃恢复后,页面的 all-visible 位可能会设置,而可见性地图位则清除。报告的值也可能因在 pg_visibility 检查可见性地图后但在检查数据页面之前发生的变化而不同。任何导致数据损坏的事件也会导致这些位不一致。

显示有关 PD_ALL_VISIBLE 位的信息的函数比只查询可见性地图的函数要昂贵得多,因为它们必须读取关系的数据块,而不仅仅是(小得多的)可见性地图。检查关系数据块的函数也同样昂贵。

F.36.1. Functions #

  • 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 将扫描该关系中的每个页面并重新构建可见性映射。(在完成之前,查询将把可见性映射当作包含所有 0。)

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