postgresql - PostgreSQL - 查询行为不一致 - 是什么原因造成的?
问题描述
我在 PostgreSQL 中有一个查询(而不是一个 func 调用),它通常会返回 5-6 秒。我认为这种情况发生在 90-59% 的情况下。有时虽然同样的 func 调用需要 10-20 分钟甚至 1-2 小时。在这种“较慢情况”中传递给 func 的参数与在“较快情况”中相同。
这可能是什么原因造成的?即使参数完全相同,PostgreSQL 是否有可能选择不同的执行计划?
因为我会被问及整体服务器负载......我不认为这是相关的。我相信我已经看到我的 func 调用很慢的情况,即使服务器上没有任何显着的额外负载(通过其他客户端会话)。
因此,查询何时会变慢对我来说似乎完全随机。但从逻辑上讲,我知道它不可能是随机的,它应该受到某些因素的影响。
这正是我的观点:这个因素是什么?这似乎是一个深刻的问题,因此任何好的建议或提示都将受到高度赞赏。
提前谢谢了。
解决方案
在将数据插入其中后,我为函数中使用的所有临时表添加了ANALYZE "tbl"
语句。我还在一些最大的临时表中添加了一些索引。
这似乎解决了这个问题。我想我永远不会知道到底是什么问题,但在我看来,即使是相同的 func 参数,Postgres 也选择了不同的执行计划。
现在,当我明确地说:“去分析这些临时表”时,似乎 Postgres 总是选择相同/快速的执行计划/路径。
只需在此处发布此答案,以便其他人在遇到类似问题时也可以尝试。
推荐阅读
- c - 如何在标准 C 中执行对不同结构的重铸?
- html - 双向文本中的数字和标点符号呈现
- c - 如何解决以下函数中的内存分配问题?(malloc)
- java - OutputStream 与 BufferedOutputStream
- python-3.x - 如何使用循环遍历openpyxl中的单元格
- elixir - 如果字段缺失,validate_required 不会将变更集设置为无效
- node.js - 为什么 npm start 给我一个错误并且无法启动本地服务器?
- html - 如何修复同一行中两个块的文本缩进
- c# - C# 上下文更新所有不在列表中的实体
- html - 如何将我的视频与左上角对齐,是什么在视频上方和下方创建了这些间距?