PostgreSQL中relallvisible值为0而非总页面数的问题咨询
原因说明
relallvisible字段值为0的核心原因是你仅执行了ANALYZE命令,该操作不会更新visibility map和relallvisible字段,具体逻辑如下:
ANALYZE的作用仅为收集表的元组数量、分布等统计信息,供PostgreSQL查询优化器生成更合理的执行计划,它不会扫描页面校验元组可见性,也不会修改visibility map或pg_class中的relallvisible值。relallvisible的数值仅会在VACUUM(常规VACUUM即可,无需VACUUM FULL)执行时更新:VACUUM会逐页校验页面内的所有元组是否对当前及未来所有事务都可见,符合条件的页面会被标记到visibility map的全可见位,最终统计全可见页面总数更新到relallvisible字段。- 你完成批量插入操作后,既没有手动执行VACUUM,后台autovacuum进程也还没有触发对该表的自动清理动作,系统尚未统计全可见页面的数量,因此显示为0。
验证方法
执行如下命令手动触发清理后再次查询即可:
VACUUM foo;
执行后relallvisible的数值会和relpages基本一致。
内容的提问来源于stack exchange,提问作者Fabrice Chapuis
相关产品推荐
相关产品推荐

