繁体   English   中英

第6次执行相同查询后PostgreSQL锁定

[英]PostgreSQL locks after 6th execution of the same query

PostgreSQL版本:Postgres Plus Advanced Server 9.2
作业系统:Windows 7/8

我有一个存储过程,其行为如下:
1.清除table1
2.根据在WHERE子句中传递的几个参数( 在示例中,始终为相同的参数 )从一个视图中选择( 始终同一视图
3.将上面选择的结果插入表1中

该过程的主体如下所示:

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管理器的“ 服务器状态”视图中,我观察到为插入的表以及从中填充视图的表添加了许多锁。

任何人都可以使用PostgreSQL的经验告诉我,如果有某种的设置来解决此问题的还是没这种或类似的事情发生他人使用PG?

谢谢!!!

以后的编辑 :- 当在同一会话中进行6次调用时, 才会始终出现此问题-在存储过程结束时,我们不会明确提交

大胆猜测:您正在使用具有默认准备阈值的JDBC。

查看禁用服务器端准备是否可以使问题消失。 请参阅PgJDBC文档

如果该函数内有慢速调用,则失败:尝试启用auto_explain并启用对函数体的处理。 然后在第六次调用中查看计划是否由于某种原因而更改。

我知道这是一个非常老的问题,但是昨天我遇到了完全相同的问题。

意识到它很棘手,因为它总是在第六次之后才出现。

我无法解释原因,但是我能够解决它。

在我的情况下,我必须更改它所在的部分

SELECT (sum(coalesce(debito.vl_conta,0)) ) ...

execute 'SELECT (sum(coalesce(debito.vl_conta,0)) ) ...

就是这样。 但是在这里回答,以防万一其他人也遭受了它,或者也许解释了它为什么会发生。

谢谢,

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM