PostgreSQL documentation on vacuum声明
冻结的行版本被视为插入的XID是FrozenTransactionID,因此无论环绕问题如何,对于所有正常事务来说,它们都将看起来是"过go 的",因此这样的行版本将一直有效,直到被删除为止,无论删除时间有多长.
并进一步指出,
RelFrozenxid值大于AutoVacuum_Freeze_max_age事务的旧事务的表始终被清理
对我来说,第一个摘录意味着这样一个表,其中表上的每条记录都被‘冻结’,并且表没有进一步的更改,为了防止事务ID回绕,不需要进一步的真空.
但第二个摘录说的正好相反,它说even for tables with everything frozen and no changes a periodic vacuum is needed for wraparound prevention reasons?
这两种说法哪一种是正确的?
我做了一个小测试,第二个似乎是真的,但我不愿相信:
create t (c int);
select age(c.relfrozenxid) from pg_class c where relname = 't';
-- 6
vacuum freeze t;
select age(c.relfrozenxid) from pg_class c where relname = 't';
-- 2
select age(c.relfrozenxid) from pg_class c where relname = 't';
-- 68
vacuum freeze t;
select age(c.relfrozenxid) from pg_class c where relname = 't';
-- 7
select age(c.relfrozenxid) from pg_class c where relname = 't';
-- 15
对我来说,这似乎是Postgres中的一个错误,静态表一次又一次地对它们执行autovacuum (to prevent wraparound)
,除非您有某种脚本定期对它们执行vacuum freeze
?