在PostgreSQL9.4上,我有一个表,它从来没有任何更新或删除,只有插入和选择。因此,它从来没有得到自动真空,但它仍然是自动分析,当它做到了,它可能需要超过100秒。在这100秒钟和相当长的时间之后,DB的性能是糟糕的,我的应用程序报告db响应时间在40-150秒范围内,而不是正常的2ms范围。
我一直听说您不应该禁用自动真空,但是当我为这个表设置autovaccum_enabled=false时,db执行的可靠性要高得多。有理由在这张桌子上启用它吗?查询规划器最终会因为没有在从未得到更新或删除的表上运行自动分析而受到影响吗?有更好的办法解决这个问题吗?
编辑:为这个表修改autovacuum_analyze_threshold和autovacuum_analyze_scale_factor以使分析发生得更频繁会更好吗?
发布于 2015-12-18 23:01:15
我认为您最好的选择是使用您最喜欢的操作系统调度工具在您选择的时候显式地、先发制人地运行ANALYZE <table>,比如凌晨3点。
PostgreSQL的自动真空和自分析是由活动计数器驱动的.这有一个不幸的影响,即活动计数器跨越阈值的时间很可能正是数据库最活跃的时候,也就是您最不希望这些维护任务运行的时候。通过在非高峰时间先发制人地运行任务,您将重置活动计数器,这样自动版本很少会找到要做的工作。但万一出了什么差错,他们还在那里救你的命。
查询规划器最终会因为没有在从未得到更新或删除的表上运行自动分析而受到影响吗?
这不能用你提供的信息来回答。例如,如果该表只通过唯一索引获得一行查找,过时的统计信息就不太可能成为问题。如果它得到复杂的分析查询,它可能是一个更大的问题。
https://dba.stackexchange.com/questions/124013
复制相似问题