内容提要
本文介绍监控 PostgreSQL 自动清理的实用查询。自动清理清除死元组并执行 ANALYZE 收集统计信息。可通过清理紧迫度判断死元组是否过多,用 pgstattuple 扩展检测表膨胀,并监控自动分析、可见性映射及事务 ID 回卷风险,以便及时调优参数,保障数据库性能。
延伸解读
监控自动清理的实用价值
自动清理不仅清除死元组,还执行自动分析以收集优化器统计信息,这对数据库健康和SQL性能至关重要。通过监控自动清理任务是否完成,可以在数据库出现问题前调整参数。作者分享的查询覆盖了清理紧迫度、表膨胀、自动分析、可见性映射和事务ID回卷等关键方面,为管理员提供了全面的监控手段。
清理紧迫度与死元组监控
清理紧迫度因子超过1时,自动清理应触发。若因子远大于1,可能表明自动清理工作进程不足或存在锁冲突。该查询考虑了PostgreSQL 18之前没有autovacuum_vacuum_max_threshold的情况,以及表级存储选项覆盖全局参数的可能性,因此较为复杂但更准确。
表膨胀检测的可靠方法
PostgreSQL不跟踪表中的空闲空间,一些监控查询试图猜测但往往不准确。唯一可靠的方法是使用pgstattuple扩展,它通过顺序扫描提供精确的空闲空间百分比。为避免影响性能,应在安静时段偶尔运行,或使用pgstattuple_approx()进行近似扫描。
可见性映射与事务ID回卷风险
可见性映射中标记为all-visible的页面比例影响索引-only扫描的效率。若all_visible_factor过低,需调整autovacuum_vacuum_scale_factor或autovacuum_vacuum_insert_scale_factor。同时,监控pg_database中的事务ID年龄和multixact年龄,防止回卷。若年龄远超autovacuum_freeze_max_age或autovacuum_multixact_freeze_max_age,需检查自动清理受阻的原因。
Q&A
自动清理除了清理死元组,还有哪些任务?
自动清理还负责自动分析(ANALYZE),收集优化器统计信息以保障查询性能。
如何判断自动清理是否应该触发?
可以计算“清理紧迫度”因子,当该因子超过1时,自动清理应该触发。
监控表膨胀最可靠的方法是什么?
使用pgstattuple扩展,通过查询列出空闲空间百分比最高的表。
如何监控自动分析是否及时?
可以修改监控清理紧迫度的查询,排除TOAST表和pg_statistic,报告需要自动分析的表。
为什么可见性映射对索引-only扫描很重要?
可见性映射中标记为“all-visible”的页面比例高,可以避免堆获取,提高索引-only扫描效率。
如何监控事务ID回卷风险?
使用pg_database,检查最老未冻结事务ID的年龄,如果远大于autovacuum_freeze_max_age,则存在风险。