Transaction ids are 32-bit and wrap. A row whose xmin falls more than 2^31 transactions behind the current xid would appear to be in the future, so Postgres must mark old rows frozen before that happens. autovacuum_freeze_max_age is the table age at which autovacuum stops being optional: a worker is launched even if the table is otherwise idle and autovacuum is switched off. It is a deadline, not a schedule. On a table that vacuums normally, vacuum_freeze_table_age escalation rides one of those runs and advances relfrozenxid first, so this deadline never arrives and the value it holds stops mattering. That is why the default is usually the right answer: raising it only shortens the margin before the 2^31 limit forces the cluster read-only.