首页 > 解决方案 > PostgreSQL - 查询行为不一致 - 是什么原因造成的?

问题描述

我在 PostgreSQL 中有一个查询(而不是一个 func 调用),它通常会返回 5-6 秒。我认为这种情况发生在 90-59% 的情况下。有时虽然同样的 func 调用需要 10-20 分钟甚至 1-2 小时。在这种“较慢情况”中传递给 func 的参数与在“较快情况”中相同。

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

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

因此,查询何时会变慢对我来说似乎完全随机。但从逻辑上讲,我知道它不可能是随机的,它应该受到某些因素的影响。

这正是我的观点:这个因素是什么?这似乎是一个深刻的问题,因此任何好的建议或提示都将受到高度赞赏。

提前谢谢了。

标签: postgresqlamazon-rdspostgresql-11

解决方案


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

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

现在,当我明确地说:“去分析这些临时表”时,似乎 Postgres 总是选择相同/快速的执行计划/路径。

只需在此处发布此答案,以便其他人在遇到类似问题时也可以尝试。


推荐阅读