pg_visibility
检查可见性图(VM)和页面级可见性信息
概览
| 扩展包名 | 版本 | 分类 | 许可证 | 语言 |
|---|---|---|---|---|
pg_visibility | 1.2 | STAT | PostgreSQL | C |
| ID | 扩展名 | Bin | Lib | Load | Create | Trust | Reloc | 模式 |
|---|---|---|---|---|---|---|---|---|
| 6960 | pg_visibility | 否 | 是 | 否 | 是 | 否 | 否 | - |
| 相关扩展 | amcheck pageinspect pg_freespacemap pgstattuple pgfincore pg_checksums pg_catcheck pgcozy |
|---|
版本
| PG18 | PG17 | PG16 | PG15 | PG14 |
|---|---|---|---|---|
| 1.2 | 1.2 | 1.2 | 1.2 | 1.2 |
安装
提示:这是 PostgreSQL 内核自带的 contrib 扩展
CREATE EXTENSION pg_visibility;
用法
pg_visibility 提供函数来检查和验证可见性映射(VM),VM 追踪哪些页面仅包含对所有事务可见的元组。
函数
单页可见性:
-- 特定块的 VM 位
SELECT * FROM pg_visibility_map('my_table', 0);
-- 返回:all_visible、all_frozen
-- VM 位加上页面的 PD_ALL_VISIBLE 标志
SELECT * FROM pg_visibility('my_table', 0);
-- 返回:all_visible、all_frozen、pd_all_visible
所有页面的可见性:
-- 每个页面的 VM 位
SELECT * FROM pg_visibility_map('my_table');
-- 返回:blkno、all_visible、all_frozen
-- 每个页面的 VM 位加上 PD_ALL_VISIBLE
SELECT * FROM pg_visibility('my_table');
-- 返回:blkno、all_visible、all_frozen、pd_all_visible
汇总:
SELECT * FROM pg_visibility_map_summary('my_table');
-- 返回:all_visible(计数)、all_frozen(计数)
损坏检测
-- 查找 all-frozen 页面上实际未冻结的元组
SELECT * FROM pg_check_frozen('my_table');
-- 查找 all-visible 页面上实际非全可见的元组
SELECT * FROM pg_check_visible('my_table');
如果任一函数返回行,则可见性映射已损坏。
修复
-- 截断可见性映射(强制完整 VACUUM 重建)
SELECT pg_truncate_visibility_map('my_table');
-- 然后执行:VACUUM my_table;
访问权限
函数需要超级用户或 pg_stat_scan_tables 角色。pg_truncate_visibility_map 需要超级用户。