【问题标题】:PostgreSQL - query behaves inconsistently - what is causing this?PostgreSQL - 查询行为不一致 - 是什么原因造成的?
【发布时间】:2019-05-11 09:32:43
【问题描述】:

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

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

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

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

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

提前非常感谢。

【问题讨论】:

  • 你能分享一下查询吗?
  • @CarlosAlvesJorge 不是真的...这是一个函数调用,涉及多个查询。但是缓慢总是在函数的最终 SELECT 中。问题是......它并不总是很慢......具有相同参数的相同查询有时很快,有时(更罕见)很慢。因此,即使我共享查询,我也不确定它是否会提供任何有价值的信息。更不用说需要熟悉所涉及的表格等。
  • 参数嗅探 - 您之间是否还有其他函数调用,例如日期范围更广/范围更广?
  • @peter.petrov 无论参数如何,SELECT 都将始终按相同的列加入/过滤/排序?
  • @LukaszSzozda 现在我需要的只是一些好的想法/提示,我会进一步挖掘。在过去的 3-4 天里,我一直在努力解决这个问题,所以......我不希望在 1-2 小时内解决它。

标签: postgresql amazon-rds postgresql-11


【解决方案1】:

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

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

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

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

【讨论】:

    【解决方案2】:

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

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

    【讨论】:

    • 不,阻塞不是原因。我检查了阻塞,没有。我只是忘了在这里提到我已经检查了阻塞。
    猜你喜欢
    • 2015-12-06
    • 2015-01-07
    • 1970-01-01
    • 2012-07-27
    • 2021-07-04
    • 2021-05-23
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多