Postgres 自动分析性能

Kyl*_*yle 3 postgresql postgresql-9.4 autovacuum

在 postgresql 9.4 上,我有一个从未有任何更新或删除的表,只有插入和选择。因此它永远不会被自动吸尘,但它仍然会被自动分析,当它发生时,它可能需要 100 多秒。在那 100 秒和之后的很长一段时间内,数据库性能很糟糕,我的应用程序报告的数据库响应时间在 40-150 秒范围内,而不是正常的 2 毫秒范围内。

我一直听说你不应该禁用自动真空,但是当我为这个表设置 autovaccum_enabled=false 时,数据库的性能要可靠得多。是否有理由在这张桌子上启用它?查询计划器最终是否会因为没有在永远不会更新或删除的表上运行自动分析而受到影响?有没有更好的方法来解决这个问题?

编辑:潜在地修改该表的 autovacuum_analyze_threshold 和 autovacuum_analyze_scale_factor 以使分析更频繁地发生会更好吗?

jja*_*nes 5

我认为你最好的选择是使用你最喜欢的操作系统调度工具ANALYZE <table>在你选择的时间显式和先发制人地运行,比如凌晨 3 点

PostgreSQL 的 autovacuum 和 autoanalyze 是活动计数器驱动的。不幸的是,活动计数器超过阈值的时间很可能恰好是数据库最活跃的时间,这是您最不希望这些维护任务运行的时间。通过在非高峰时间抢先运行任务,您将重置活动计数器,这样自动版本很少会找到工作要做。但万一出现问题,他们仍然在那里拯救你的培根。

查询计划器最终是否会因为没有在永远不会更新或删除的表上运行自动分析而受到影响?

您提供的信息无法回答这个问题。例如,如果该表仅通过唯一索引进行单行查找,则过时的统计信息不太可能成为问题。如果它得到复杂的分析查询,它可能会成为一个更大的问题。