pg_visibility
模块提供了一种检查表的可见性映射 (VM) 和页面级可见性信息的方法。它还提供函数来检查可见性映射的完整性并强制重建它。
使用三个不同的位来存储有关页面级可见性的信息。可见性映射中的全可见位表示关系的相应页面中的每个元组对当前和未来事务都是可见的。可见性映射中的全冻结位表示页面中的每个元组都已冻结;也就是说,在该页面上插入、更新、删除或锁定元组之前,未来的 Vacuum 无需修改该页面。页面头的 PD_ALL_VISIBLE
位与可见性映射中的全可见位具有相同的含义,但存储在数据页面本身中,而不是单独的数据结构中。这两个位通常会一致,但有时在崩溃恢复后,页面的全可见位可能会被设置,而可见性映射位则被清除。报告的值也可能因在 pg_visibility
检查可见性映射之后和检查数据页面之前发生的更改而不同。导致数据损坏的任何事件也可能导致这些位不一致。
显示有关 PD_ALL_VISIBLE
位的信息的函数比仅查询可见性映射的函数成本更高,因为它们必须读取关系的数据块,而不仅仅是(更小的)可见性映射。检查关系的数据块的函数同样昂贵。
pg_visibility_map(relation regclass, blkno bigint, all_visible OUT boolean, all_frozen OUT boolean) 返回记录
返回给定关系的给定块的可见性映射中的所有可见位和所有冻结位。
pg_visibility(relation regclass, blkno bigint, all_visible OUT boolean, all_frozen OUT boolean, pd_all_visible OUT boolean) 返回记录
返回给定关系的给定块的可见性映射中的所有可见位和所有冻结位,以及该块的 PD_ALL_VISIBLE
位。
pg_visibility_map(relation regclass, blkno OUT bigint, all_visible OUT boolean, all_frozen OUT boolean) 返回记录集
返回给定关系的每个块的可见性映射中的所有可见位和所有冻结位。
pg_visibility(relation regclass, blkno OUT bigint, all_visible OUT boolean, all_frozen OUT boolean, pd_all_visible OUT boolean) 返回记录集
返回给定关系的每个块的可见性映射中的所有可见位和所有冻结位,以及每个块的 PD_ALL_VISIBLE
位。
pg_visibility_map_summary(relation regclass, all_visible OUT bigint, all_frozen OUT bigint) 返回记录
根据可见性映射返回关系中所有可见页面的数量和所有冻结页面的数量。
pg_check_frozen(relation regclass, t_ctid OUT tid) 返回 tid 集
返回存储在可见性映射中标记为全部冻结的页面中的非冻结元组的 TID。如果此函数返回非空 TID 集,则可见性映射已损坏。
pg_check_visible(relation regclass, t_ctid OUT tid) 返回 tid 集
返回存储在可见性映射中标记为全部可见的页面中的非全部可见元组的 TID。如果此函数返回非空 TID 集,则可见性映射已损坏。
pg_truncate_visibility_map(relation regclass) 返回 void
截断给定关系的可见性映射。如果您认为关系的可见性映射已损坏并希望强制重新构建它,则此函数很有用。在此函数执行后对给定关系执行的第一个 VACUUM
将扫描关系中的每一页并重新构建可见性映射。(在完成之前,查询将把可见性映射视为包含所有零。)
默认情况下,这些函数只能由超级用户和具有 pg_stat_scan_tables
角色权限的角色执行,但 pg_truncate_visibility_map(relation regclass)
例外,它只能由超级用户执行。
Robert Haas <[email protected]>