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

时间:2014-08-27 12:41:11

标签: sql postgresql database-performance postgresql-9.2 locks

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次调用时,问题始终发生 - 我们没有明确提交存储过程的结束

2 个答案:

答案 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)) ) ...

就是这样。但回答这里以防万一其他人也遭受了损失,或者解释为什么会发生这种情况。

谢谢,