如何判断 autovacuum 需要多长时间来清理 postgres 表?

Con*_*bil 1 postgresql performance

系统表pg_stat_all_tables记录 autovacuum 守护进程最后一次清理表的时间。

我注意到一些性能问题与数据库中较大的表之一被清理之间可能存在关联。然而,由于我不知道吸尘过程的持续时间,所以我不能 100% 确定。

如何查明在任何给定的表上自动清理花费了多长时间?

Dan*_*ité 6

log_autovacuum_min_duration当设置为 0 或持续时间阈值时,自动清理持续时间会在日志中报告。

它产生这样的输出:

2021-05-17 03:59:40.530 CEST [25526] 日志:表“db.public.tablename”的自动真空:索引扫描:1
    页数:0 已删除,1001527 保留,0 由于引脚而跳过,0 跳过冻结
    元组:1346603 已删除,15288094 保留,224598 已死亡但尚未删除,最旧的 xmin:736
    缓冲区使用情况:1104110 次命中,2210831 次未命中,1716564 次脏污
    平均读取速率:2.329 MB/s,平均写入速率:1.808 MB/s
    系统使用情况:CPU:用户:46.90 s,系统:60.02 s,已用:7417.28 s

从这个例子中可以看出,在大表上它可能会很长,但不会因为限制而消耗那么多资源。

当操作仍在进行时,可以通过系统视图pg_stat_progress_vacuumpg_stat_activity(要与pid列连接)进行监控。