PostgreSQL版本:Postgres Plus Advanced Server 9.2
操作系统:Windows 7/8
我有一个存储过程,其行为如下:
1.清除 table1
2.根据 WHERE 子句中传递的几个参数从视图中选择(同一视图总是)(为了示例,总是相同的参数< / em>的)
3.在 table1 中插入上面选择的结果。
程序正文如下:
BEGIN
PERFORM clear_table1(p_session_id);
INSERT INTO table1 (session_id, id1, adress, x, y)
SELECT p_session_id, id1, adress, x, y
FROM myview
WHERE (CONDITION)
AND (CONDITION)
AND (CONDITION)
AND (lower(adress) LIKE lower(p_adress) OR p_adress IS NULL)
LIMIT 6000;
END;
前5次(总是5次)我使用完全相同的参数运行完全相同的查询,它按预期运行。下次(第6次)它运行了大量的时间,比如......几十分钟。
select * from myfunction('session_id',NULL,NULL,'%adress%')
在PostgreSQL管理器的服务器状态视图中,我观察到为表格中添加了一些锁,其中我插入以及填充视图的表 < / p>
任何有PostgreSQL经验的人都可以告诉我,是否有某种设置可以解决这种行为或这样或类似事情发生在使用PG的其他人身上?
感谢!!!
稍后编辑: - 当从同一会话进行6次调用时,问题始终发生 - 我们没有明确提交存储过程的结束
答案 0 :(得分:0)
狂野猜测:您正在使用具有默认准备阈值的JDBC。
查看禁用服务器端准备是否会使问题消失。请参阅the PgJDBC docs。
如果失败,如果慢速调用在函数内:尝试启用auto_explain
并启用函数体处理。然后在第6次调用时查看计划是否因某种原因而发生变化。
答案 1 :(得分:-1)
我知道这是一个非常古老的问题,但昨天我遇到了完全相同的问题。
实现它很棘手,因为它总是在第六次发生之后。
我无法解释原因,但我能够解决它。
在我的情况下,我必须更改它所在的部分
SELECT (sum(coalesce(debito.vl_conta,0)) ) ...
到
execute 'SELECT (sum(coalesce(debito.vl_conta,0)) ) ...
就是这样。但回答这里以防万一其他人也遭受了损失,或者解释为什么会发生这种情况。
谢谢,