E.29. lt_visibility

E.29.1. 函数

lt_visibility模块提供了一种查看表的可见性映射(VM)和页面级可见性信息的方法。它还提供了检查可见性映射完整性并强制重新构建它的函数。

三个不同的位用于存储页面级可见性信息。可见性映射中的全可见位表示关系对应页面中的每个元组对于每个当前和未来的事务都是可见的。可见性映射中的全冻结位表示页面中的每个元组都已被冻结;也就是说,直到插入、更新、删除或者在该页面上锁定元组时,将不需要对该页面进行任何未来的vacuum修改。页面头的PD_ALL_VISIBLE位与可见性映射中的全可见位具有相同的含义,但它是存储在数据页面本身而不是单独的数据结构中。这两个位通常是一致的,但在崩溃恢复后,页面的全可见位有时可能被设置而可见性映射位是未设置的。由于在lt_visibility检查可见性映射和检查数据页面之间发生的更改,报告的值也可能不一致。任何导致数据损坏的事件也可能导致这些位不一致。

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

E.29.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)除外,它只能由超级用户执行。