【发布时间】:2021-05-10 10:36:07
【问题描述】:
我们注意到我们的一个表在 PG 12 上显着增长。该表是非常频繁更新的目标,包含多种列类型,包括一个非常大的 text 列(通常包含超过 50kb 的数据) - 我们运行一个本地 cron 作业来查找早于 X 时间的行并将 text 列设置为空值(因为在 X 时间之后我们不再需要该特定列的数据)。
我们知道,由于 MVCC 模型,这实际上并没有释放磁盘空间,但我们希望 auto-vacuum 能够解决这个问题。令我们惊讶的是,在没有自动真空运行的情况下,该表继续增长(现在超过 40GB)。手动运行真空已经解决了这个问题,我们不再看到增长。
这导致我调查其他表,我意识到我根本不了解自动真空是如何触发的。
这是我对它的工作原理的理解,希望有人可以分开:
- 我查找其中包含大量死元组的表:
select * from pg_stat_all_tables ORDER BY n_dead_tup desc; - 我将
tableX识别为 33169557 个死元组(n_dead_tup 列)。 - 我运行
select * from pg_class ORDER BY reltuples desc;来检查表tableX上的估计行数 - 我通过
reltuples列识别了 1725253 行。 - 我确认我的 autovacuum 设置:
autovacuum_vacuum_threshold = 50和autovacuum_vacuum_scale_factor = 0.2 - 我应用公式
threshold + pg_class.reltuples * scale_factor,所以,50 + 1725253 * 0.2返回 345100.6
据我了解,一旦找到 ~345100 个死元组,自动真空将在此表上启动。但是tableX 已经有多达 33169557 个死元组了!,这张桌子上的 last_autovacuum 是在 2 月。
欢迎任何澄清。
【问题讨论】:
-
有多少工人在工作? postgresql.org/docs/12/maintenance.html
标签: postgresql autovacuum