{"Entry":{"collection":"guc","key":"vacuum_freeze_table_age","name":"vacuum_freeze_table_age","aliases":[],"metadata":{"baseline":false,"boot_human":"Not specified","boot_val":null,"category":"Vacuuming / Freezing","category_zh":"","changed_in":["18"],"changes":[{"documentation_changed":false,"fields":{},"from":"8.3","status":"added","to":"8.4"},{"documentation_changed":true,"fields":{},"from":"9.1","status":"changed","to":"9.2"},{"documentation_changed":true,"fields":{},"from":"9.2","status":"changed","to":"9.3"},{"documentation_changed":true,"fields":{},"from":"9.5","status":"changed","to":"9.6"},{"documentation_changed":true,"fields":{},"from":"12","status":"changed","to":"13"},{"documentation_changed":true,"fields":{},"from":"13","status":"changed","to":"14"},{"documentation_changed":true,"fields":{},"from":"16","status":"changed","to":"17"},{"documentation_changed":false,"fields":{"category":{"from":"Client Connection Defaults / Statement Behavior","to":"Vacuuming / Freezing"}},"from":"17","status":"changed","to":"18"}],"content_hash":"e7a4c706d29ecf84fa8582f0d6f50486a91524e079d92a454e504442ba4a7a9a","context":"","default_changed_in":[],"default_history":[{"from":"9.0","to":"19","value":"150000000"}],"editorial":{"advice":{"olap":"Schedule aggressive XID freezing for static or newly loaded partitions while I/O headroom is available; lowering the threshold can spread work across maintenance windows.","oltp":"Set an XID aggressive-scan threshold that routine maintenance can reach and complete before autovacuum_freeze_max_age. Confirm full-table scan time on the largest relations.","small":"Keep the default and watch the oldest relfrozenxid in every database. Setting zero forces aggressive behavior for every VACUUM and is rarely appropriate globally."},"mechanism":["Sets the XID age at which VACUUM switches to an aggressive scan so it can advance a table’s relfrozenxid. It is a user-context setting.","An aggressive XID scan visits every page not already all-frozen and freezes eligible XIDs. PostgreSQL caps the effective value at 95% of autovacuum_freeze_max_age, leaving room for manual maintenance before forced anti-wraparound autovacuum.","Monitor age(relfrozenxid) and age(datfrozenxid), not relminmxid. The separate vacuum_multixact_freeze_table_age controls MXID-driven aggressive scans."],"pitfalls":["Monitoring relminmxid instead of the XID horizon relfrozenxid.","Setting a value above 95% of autovacuum_freeze_max_age and assuming PostgreSQL will use it unchanged.","Forcing aggressive scans too frequently on large mutable tables.","Waiting for forced anti-wraparound autovacuum instead of measuring routine full-scan completion time."],"references":[{"title":"PostgreSQL 19 Beta 4: vacuum_freeze_table_age","url":"https://www.postgresql.org/docs/19/runtime-config-vacuum.html#GUC-VACUUM-FREEZE-TABLE-AGE"},{"title":"PostgreSQL 19 release notes","url":"https://www.postgresql.org/docs/19/release-19.html"}],"related":["autovacuum_freeze_max_age","vacuum_freeze_min_age","vacuum_failsafe_age","vacuum_multixact_freeze_table_age","autovacuum","log_autovacuum_min_duration"],"summary":"vacuum_freeze_table_age — Age at which VACUUM should scan whole table to freeze tuples. Observed in PG9.0–19 Beta 4; its last measured boot default is 150000000 in PG19 Beta 4, with user context. This is a beta-snapshot fact and can change before PostgreSQL 19 GA."},"enumvals":[],"first_version":"8.4","group":"Vacuuming","group_slug":"vacuum","imported_at":"2026-09-27T17:57:32.292317+08:00","intro_commit":{},"key":"vacuum_freeze_table_age","last_version":"20","max_val":"","min_val":"","name":"vacuum_freeze_table_age","position":454,"present_in":["8.4","9.0","9.1","9.2","9.3","9.4","9.5","9.6","10","11","12","13","14","15","16","17","18","19","20"],"short_desc":"VACUUM performs an aggressive scan if the table's pg_class.relfrozenxid field has reached the age specified by this setting.","short_desc_zh":"","source_rev":"english-manuals:6d5ce31bc773816df35017fd42eada6dcd81334b33ef1475c3850268829cb474","unit":"","vartype":"integer"}},"Definition":{"Collection":"guc","Key":"vacuum_freeze_table_age","SourceDatabase":"center","Version":"18","SourceTable":"guc","SourceKey":"vacuum_freeze_table_age","SourceRevision":"english-manuals:6d5ce31bc773816df35017fd42eada6dcd81334b33ef1475c3850268829cb474","Facts":{"boot_val":"150000000","category":"Vacuuming / Freezing","context":"user","description":"VACUUM performs an aggressive scan if the table's pg_class.relfrozenxid field has reached the age specified by this setting. An aggressive scan differs from a regular VACUUM in that it visits every page that might contain unfrozen XIDs or MXIDs, not just those that might contain dead tuples. The default is 150 million transactions. Although users can set this value anywhere from zero to two billion, VACUUM will silently limit the effective value to 95% of autovacuum_freeze_max_age, so that a periodic manual VACUUM has a chance to run before an anti-wraparound autovacuum is launched for the table. For more information see Section 24.1.5.","doc":{"anchor":"GUC-VACUUM-FREEZE-TABLE-AGE","file":"runtime-config-vacuum.html","lang":"en","sha256":"7047f1fa9138b97f1812532f8a905fa7479451dfd64655e029a7d387b20b22e4","slug":"18"},"documented":true,"enumvals":null,"extra_desc":null,"lang":"en","max_val":"2000000000","metadata_version":"18","min_val":"0","name":"vacuum_freeze_table_age","short_desc":"Age at which VACUUM should scan whole table to freeze tuples.","source":"pg-settings-source-snapshot","unit":null,"vartype":"integer"},"ManualEvidence":{"doc":{"anchor":"GUC-VACUUM-FREEZE-TABLE-AGE","file":"runtime-config-vacuum.html","lang":"en","sha256":"7047f1fa9138b97f1812532f8a905fa7479451dfd64655e029a7d387b20b22e4","slug":"18"}},"MeasuredEvidence":{"metadata_version":"18"}},"Text":{"Collection":"guc","Key":"vacuum_freeze_table_age","SourceDatabase":"pgweb","Version":"18","Locale":"zh-Hans","Title":"vacuum_freeze_table_age","Summary":"","BodyHTML":"\u003cp\u003e如果表的\u003ccode\u003epg_class\u003c/code\u003e.\u003ccode\u003erelfrozenxid\u003c/code\u003e字段达到此设置指定的年龄，\u003ccode\u003eVACUUM\u003c/code\u003e就会执行一次激进扫描。激进扫描与常规\u003ccode\u003eVACUUM\u003c/code\u003e不同，它会访问每一个可能包含未冻结 XID 或 MXID 的页面，而不仅仅是那些可能包含死元组的页面。默认值为 1.5 亿个事务。尽管用户可以将该值设置在 0 到 20 亿之间，\u003ccode\u003eVACUUM\u003c/code\u003e仍会悄悄将其有效值限制为不超过\u003ca href=\"/docs/18/runtime-config-vacuum.html#GUC-AUTOVACUUM-FREEZE-MAX-AGE\" rel=\"nofollow\"\u003eautovacuum_freeze_max_age\u003c/a\u003e的 95%，以便在针对该表启动防回卷自动清理之前，周期性手工\u003ccode\u003eVACUUM\u003c/code\u003e仍有机会运行。详见\u003ca href=\"/docs/18/routine-vacuuming.html#VACUUM-FOR-WRAPAROUND\" rel=\"nofollow\"\u003e第 24.1.5 节\u003c/a\u003e。\u003c/p\u003e","SourceRevision":"2026-09-11@29c86d9","ContentHash":"0501ab192c9507d32441453f6a3111eedf844efd51d3b52c1e8a6c7972d3a50f","Payload":{"carried_from":"","carry_reason":"","doc_html":"\u003cp\u003e如果表的\u003ccode class=\"structname\"\u003epg_class\u003c/code\u003e.\u003ccode class=\"structfield\"\u003erelfrozenxid\u003c/code\u003e字段达到此设置指定的年龄，\u003ccode class=\"command\"\u003eVACUUM\u003c/code\u003e就会执行一次激进扫描。激进扫描与常规\u003ccode class=\"command\"\u003eVACUUM\u003c/code\u003e不同，它会访问每一个可能包含未冻结 XID 或 MXID 的页面，而不仅仅是那些可能包含死元组的页面。默认值为 1.5 亿个事务。尽管用户可以将该值设置在 0 到 20 亿之间，\u003ccode class=\"command\"\u003eVACUUM\u003c/code\u003e仍会悄悄将其有效值限制为不超过\u003ca href=\"/docs/18/runtime-config-vacuum.html#GUC-AUTOVACUUM-FREEZE-MAX-AGE\"\u003eautovacuum_freeze_max_age\u003c/a\u003e的 95%，以便在针对该表启动防回卷自动清理之前，周期性手工\u003ccode class=\"command\"\u003eVACUUM\u003c/code\u003e仍有机会运行。详见\u003ca href=\"/docs/18/routine-vacuuming.html#VACUUM-FOR-WRAPAROUND\" title=\"24.1.5. 防止事务 ID 回卷失败\"\u003e第 24.1.5 节\u003c/a\u003e。\u003c/p\u003e","doc_same_as":""}},"RequestedLocale":"zh-Hans","Fallback":false,"Versions":["10","11","12","13","14","15","16","17","18","19","20","8.4","9.0","9.1","9.2","9.3","9.4","9.5","9.6"],"Locales":["en","zh-Hans"],"Signatures":null,"Spellings":null,"SQLState":null,"Evidence":null}
