Postgresql:自动清理分区表

4
我们有一张非常大的表,被分成了按月份的小表。我们在postgresql.conf文件中没有设置任何自动清理参数,因此它默认启用了默认参数。
过去几个月的表table_201404、table_201403在超时后不再写入或更新/删除,它们只被用于历史数据读取。为什么我们注意到自动清理进程在这些表上运行?是因为它们是主分区的一部分,PostgreSQL将这些表视为一个整体吗?
我们正在考虑关闭这些过去表的自动清理功能,但我想先咨询一下Stackoverflow的智慧。
谢谢大家...

检查这些表的vacuum守护进程是否会有问题?它会影响性能吗?您能测量到这种影响吗? - user330315
1
不确定如何衡量影响,但即使这些表已经被分区,它们仍然非常大,我们认为这些自动清理进程正在影响性能。 - dsmorey
1
“我们认为性能受到了阻碍” - 那么你没有证据或任何迹象吗? - user330315
1
抱歉,我不确定你是否特别指定了我如何进行测量。我的做法是运行一个查询来获取当前进程。有时候我会注意到有两三个自动清理程序正在运行,然后我会发现我们的磁盘IO几乎是当天特定时间应该有的两倍。 - dsmorey
1
我来给你举个具体的例子。我有一系列查询,每晚在这个时间运行。通常情况下,没有自动清理的话需要大约25分钟。现在已经快一个小时了,因为两个表正在进行自动清理。这些表是非常旧的数据,永远不会被使用,不确定为什么自动清理需要在这些表上运行? - dsmorey
1个回答

5
即使是只读表,在每20亿个事务之后仍需要进行一次环绕清理(vacuum),在默认设置下,会在每1.5亿个事务之后进行一次环绕清理。
存储在每行中的交易ID为32位,因此它们最终会循环。为了防止这导致问题,任何非常旧的transactionID都必须被替换为一个特殊值,表示“比所有其他ID都早”。因此,表必须被扫描以进行该替换。如果表从不更改,则最终每个交易ID都将被特殊值替换,概念上该表就不再需要扫描了。但是,该事实没有存储在任何地方,因此偶尔仍需要扫描该表,以便系统可以观察它们是否仍然正常。幸运的是,扫描是顺序进行的,并且只需要读取而不需要写入,因此应该相当高效。
有可能整个过程会在9.5中重新设计,以便这样的表不再需要扫描。

请解释一下。像这样的静态只读表将永远不会更改。为什么它需要自动清理?我并不反对,只是想问为什么。谢谢。 - dsmorey
每天学点东西。+1 - John Powell

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接