我们有一个非常大的表,被划分为每月表。我们没有在 postgresql.conf 文件中设置 autovacuum 参数,因此默认情况下使用默认参数。
过去几个月的表table_201404、table_201403一旦通过就不会被写入或更新/删除,仅读取历史数据。为什么我们注意到这些表上运行着 autovacuum 进程?是因为它们是主分区的一部分并且 PostgreSQL 将这些表视为一个分区吗?
我们正在考虑将这些过去的表的 autovacuum_enabled 设置为关闭,但我想首先咨询 Stackoverflow 的智慧。
谢谢大家...
最佳答案
即使是只读表也需要每 20 亿个事务清理一次以进行回绕,并且在默认设置下每 1.5 亿个事务需要清理一次以进行回绕。
每行存储的事务 ID 是 32 位,因此它们最终会回绕。为了防止这引起问题,任何非常旧的 transactionID 都必须替换为一个神奇的值,该值意味着“比所有其他 ID 更旧”。因此必须扫描该表才能进行替换。如果表永远不会改变,最终每个事务 ID 都将被替换为神奇值,并且从概念上讲,该表不再需要被扫描。但这个事实并没有存储在任何地方,因此仍然需要时不时地扫描表,以便系统可以观察到它们仍然正常。幸运的是,扫描是按顺序完成的,只需要读取,不需要写入,所以效率应该相当高。
整个事情可能会在 9.5 中重做,这样就不再需要扫描这样的表了。
关于sql - Postgresql:Autovacuum 分区表,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23543141/