vacuum full 后 max transaction id 没有太大改善

No much improvement on max transaction id after vacuum full

我们对 table 和烤面包进行了吸尘。死元组急剧下降,但最大事务 ID 几乎保持不变。我的问题是,为什么最大事务 ID 没有随着死元组的急剧下降而下降?

之前

select relname,last_autovacuum ,n_tup_upd,n_tup_del,n_tup_hot_upd,n_live_tup,n_dead_tup,n_mod_since_analyze,vacuum_count,autovacuum_count from pg_stat_all_tables where relname in ('examples','pg_toast_16450');
 relname        | last_autovacuum.              | n_tup_upd | n_tup_del | n_tup_hot_upd | n_live_tup | n_dead_tup | n_mod_since_analyze | vacuum_count | autovacuum_count 
----------------+-------------------------------+-----------+------------+---------------+------------+------------+---------------------+--------------+------------------
 examples       | 2022-01-18 23:26:52.432808+00 | 57712813  | 9818       | 48386674      | 3601588   | 306558 | 42208 | 0 | 44
 pg_toast_16450 | 2022-01-17 23:14:42.516933+00 | 0         | 5735566377 | 0             | 3763818   | 805501171 | 11472355929 | 0 | 51

SELECT max(age(datfrozenxid)) FROM pg_database;
    max
-----------
 199857797

之后

select relname,last_autovacuum ,n_tup_upd,n_tup_del,n_tup_hot_upd,n_live_tup,n_dead_tup,n_mod_since_analyze,vacuum_count,autovacuum_count from pg_stat_all_tables where relname in ('examples','pg_toast_16450');
    relname     |        last_autovacuum        | n_tup_upd |  n_tup_del  | n_tup_hot_upd | n_live_tup | n_dead_tup | n_mod_since_analyze | vacuum_count | autovacuum_count
----------------+-------------------------------+-----------+-------------+--------------+------------+------------+---------------------+--------------+------------------
 examples     | 2022-02-01 15:41:17.722575+00 | 120692014 |        9818 |      98148003 |    4172134 |      17666 |            150566 |            1 |             4064
 pg_toast_16450 | 2022-02-01 20:49:30.552251+00 |         0 | 16169731895 |             0 |    5557218 |      33365 |       32342853690 |            0 |            15281

SELECT max(age(datfrozenxid)) FROM pg_database;
    max
-----------
 183888023

是的,这是预期的。您需要 VACUUM 来冻结元组。 VACUUM (FULL) 没有。

用户容易混淆,因为两者都是由VACUUM语句触发的,但VACUUM (FULL)实际上与VACUUM完全不同。它不仅仅是“更彻底的VACUUM”。他们唯一的共同点是他们摆脱了死元组。 VACUUM (FULL) 不修改元组,因为冻结必须这样做,它只是复制它们(或者不复制,如果它们已经死了)。