PostgreSQL - 查询行为不一致 - 是什么原因造成的?

PostgreSQL - query behaves inconsistently - what is causing this?

我在 PostgreSQL 中有一个查询(而不是一个函数调用),returns 通常需要 5-6 秒。我认为这种情况发生在 90-59% 的情况下。有时,同样的 func 调用需要 10-20 分钟甚至 1-2 小时。 "slower case" 中传递给 func 的参数与 "faster case" 中的相同。

这可能是什么原因造成的?即使参数完全相同,PostgreSQL 是否有可能选择不同的执行计划?

因为我会被问及服务器的整体负载...我认为这不相关。我相信我已经看到过这样的情况,即使服务器上没有任何显着的额外负载(通过其他客户端会话),我的 func 调用也很慢。

所以查询什么时候变慢对我来说似乎完全是随机的。但按道理来说,我知道这不可能是随机的,应该是受到某种因素的影响。

这正是我的观点:这个因素是什么?这似乎是一个很深的问题,因此我们将不胜感激任何好的建议或提示。

非常感谢。

是的,postgres 可以选择不同的执行计划,这可能是问题的原因,但我觉得不太可能。

你有没有在查询运行的时候看pg_stat_activity很久?检查它是否没有卡在等待其他已获得锁的进程上。

我在将数据插入函数后,为函数中使用的 所有临时表 添加了 ANALYZE "tbl" 语句。我还为一些最大的临时表添加了一些索引。

这似乎解决了问题。我想我永远不会知道问题到底是什么,但在我看来,Postgres 正在为相同的 func 参数选择不同的执行计划。

现在当我明确地说:"go and analyze these temp tables" 时,Postgres 似乎总是选择 same/fast 执行 plan/path。

只是在这里发布这个答案,这样其他人也可以尝试一下,如果他们 运行 遇到类似的问题。