2014-05-08 180 views
2

我们有一个非常大的表,它被分区到每月表中。我们没有在postgresql.conf文件中设置autovacuum参数,所以它默认情况下默认使用默认参数。Postgresql:自动清理分区表

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

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

感谢所有...

+0

真空deamon检查这些表是否存在问题?它会影响你的表现吗?你能衡量这种影响吗? –

+1

不确定如何衡量影响,但这些表格甚至被分区,都非常大,我们认为性能受到这些自动清理过程的阻碍。 – dsmorey

+1

“*我们认为表现受阻*” - 所以你没有证据或者任何迹象? –

回答

5

即使只读表需要进行抽真空环绕连用2个十亿交易,默认设置下被清理过环绕每隔1.5亿的交易。

每行存储的事务ID都是32位,所以它们最终环绕。为了防止这个问题发生,任何非常旧的transactionID都必须用一个意思是“比所有其他ID更老”的魔术值来替换。所以必须扫描表来进行替换。如果表格永远不会改变,那么最终每个交易ID将被替换为魔术值,并且概念上该表格不再需要被扫描。但是这个事实并没有存储在任何地方,所以现在仍然需要对表格进行扫描,以便系统可以观察到它们仍然可以。幸运的是,扫描顺序完成,只需要读取,而不是写入,所以它应该是相当高效的。

有可能整个事情将在9.5中重做,以便这样的表不再需要被扫描。

+0

请解释一下。像这样的静态只读表将不会改变。为什么需要自动清除?我不是不同意,只是问为什么。谢谢 – dsmorey

+0

每天学习一些东西。 +1 –

+0

感谢您的更新@jjanes。 +1 – dsmorey