Postgresql:Autovacuum分区表

时间:2014-05-08 13:27:06

标签: sql postgresql vacuum autovacuum

我们有一个非常大的表被分成月表。我们在postgresql.conf文件中没有设置autovacuum参数,因此默认情况下它使用默认参数。

过去几个月表table_201404,table_201403一旦传递就不会被写入或更新/删除,它们只会从历史数据中读取。为什么我们注意到在这些表上运行的autovacuum进程?是因为它们是主分区的一部分而PostgreSQL将这些表视为一个?

我们正在考虑将autovacuum_enabled设置为关闭这些过去的表格,但我想先咨询Stackoverflow的智慧。

谢谢大家......

1 个答案:

答案 0 :(得分:5)

即使是只读表也需要进行抽真空,每20亿次交易需要进行一次环绕,并且在默认设置下进行抽真空,每1.5亿次交易进行一次环绕。

每行存储的事务ID是32位,因此它们最终会回绕。为了防止这种情况造成问题,任何非常旧的transactionID都必须替换为魔术值,这意味着"比所有其他ID更老"。因此必须扫描该表以进行替换。如果表永远不会更改,最终每个事务ID都将替换为魔术值,并且概念上不再需要扫描该表。但是这个事实并没有存储在任何地方,所以现在仍需要对表进行扫描,以便系统能够观察到它们仍然可以正常运行。幸运的是,扫描是按顺序完成的,只需要读取,而不是写入,因此它应该相当有效。

可能会在9.5中重做整个内容,以便不再需要扫描这样的表格。