受支持版本: 当前版本 (18) / 17 / 16 / 15 / 14
开发版本: devel

F.34. pg_visibility — 可见性映射信息与工具 #

pg_visibility 模块提供了一种检查表的可见性映射(VM)以及页级可见性信息的手段。 它还提供了一些函数,用于检查可见性映射的完整性,并强制重建该映射。

页级可见性信息使用三个不同的位来存储。可见性映射中的全部可见(all-visible)位表示该关系对应页中的每个元组对当前及未来的所有事务均可见。可见性映射中的全部冻结(all-frozen)位表示该页中的每个元组都已被冻结;也就是说,在该页上发生插入、更新、删除或锁定操作之前,未来的清理(VACUUM)都不需要修改该页。页头中的PD_ALL_VISIBLE位与可见性映射中的 all-visible 位含义相同,但它存储在数据页本身之中,而非单独的数据结构中。这两个位通常应当一致,但在崩溃恢复之后,有时页面上的 all-visible 位可能已被置位,而可见性映射中的对应位却仍然为零。由于在pg_visibility检查可见性映射之后、检查数据页之前可能发生变更,因此报告的值也可能不一致。任何导致数据损坏的事件也可能导致这些位不一致。

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

F.34.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 的页面里、实际上并非对所有事务 都可见的元组的 TID。如果该函数返回的 TID 集合非空,则说明可见性映射已损坏。

pg_truncate_visibility_map(relation regclass) returns void #

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

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

F.34.2. 作者 #

Robert Haas

提交更正

如果您发现文档中有不正确的内容、与您使用特定功能的经验不符或需要进一步说明,请使用此表单来报告文档问题。