问题:
x86_64-pc-linux-gnu上的PostgreSQL 12.2 (Ubuntu 12.2-2.pgdg18.04+1),由gcc (Ubuntu 7.4.0-1ubuntu1~18.04.1) 7.4.0编译,64位
客户端是数据抓取和来自我的报表服务器的相同行为,该报表服务器使用Jaspersoft附带的驱动程序
在同一会话下,我使用不同的参数多次运行相同的函数进行报告。使用相同的参数也可以做同样的事情。
这些都是一个接一个的运行,而不是同时运行。
结果只有几行,但确实从相当多的表中读取,没有写入。
它只是表连接,并不选择对表本身的输入或更新(我希望能够post查询,但出于安全原因不能)。
在我运行这个函数几次之后,它开始变慢并达到一个不可接受的水平。例如,其中一个函数从1秒到超过90+秒(这就是我停止测试的地方)。
故障排除:
我已经去了服务器并终止了会话,在那之后它开始正常运行几次。
标准报告确实使用了临时表,但我删除了它以进行测试。在开始出现问题后,我运行了以下命令来尝试解决该问题。
清理所有接触到的表;--我知道这不应该是必需的,因为这些表没有重大更改,但我尝试了几乎所有的方法。语言plpgsql。
SET SESSION AUTHORIZATION DEFAULT;
RESET ALL;
DEALLOCATE ALL;
CLOSE ALL;
UNLISTEN *;
SELECT pg_advisory_unlock_all();
DISCARD PLANS;
DISCARD SEQUENCES;
DISCARD TEMP;
在不通过作业运行单独的应用程序或脚本的情况下,似乎不存在终止空闲连接的好方法。
发布于 2020-06-24 12:55:30
事实证明,有一个已知的问题,但很少讨论执行计划中的参数问题,在同一会话中,从第6次运行开始,运行时间会长得多。解决方案是将执行计划设置为force_custom_plan,在我的情况下,它工作得很好。
ALTER FUNCTION xy设置plan_cache_mode =force_custom_plan
https://stackoverflow.com/questions/62477524
复制