我在PostgreSQL中有一个查询(而不是func调用),该查询通常返回5-6秒。我认为,这种情况发生在90-59%的情况下。有时,尽管相同的功能调用需要10到20分钟,甚至1-2个小时。在这种“较慢的情况”下,传递给函数的参数与“较快的情况”下的参数相同。
可能是什么原因造成的?即使参数完全相同,PostgreSQL是否有可能选择其他执行计划?
由于将询问服务器的整体负载...我认为这没有关系。我相信我曾经见过一些情况,即使没有在服务器上增加任何其他负载(通过其他客户端会话),我的函数调用仍然很慢。
对我来说,什么时候查询变慢似乎是完全随机的。但是从逻辑上讲,我知道它不可能是随机的,它应该受到某些因素的影响。
这正是我的意思:这是什么因素?这似乎是一个很深的问题,因此,任何好的建议或提示都将受到高度赞赏。
非常感谢。
答案 0 :(得分:2)
在将数据插入到我的函数中使用的所有临时表中,我添加了ANALYZE "tbl"
条语句。我还向一些最大的临时表中添加了一些索引。
这似乎已经解决了问题。我想我永远不会知道问题出在哪里,但是在我看来,即使对于相同的func参数,Postgres仍在选择不同的执行计划。
现在,当我明确地说:“去分析这些临时表”时,似乎Postgres总是选择相同/快速的执行计划/路径。
只需在此处发布此答案,以便其他人也遇到类似问题时也可以尝试。
答案 1 :(得分:0)
是的,postgres可以选择一个不同的执行计划,这可能是导致问题的原因,但是对我来说似乎不太可能。
查询运行很长时间后,您是否查看过pg_stat_activity?检查它是否没有卡在等待获得锁定的其他进程上。