在PostgreSQL存储过程中执行COMMIT

时间:2010-02-21 09:18:27

标签: postgresql stored-procedures commit

我有一个PostgreSQL存储过程,它循环遍历一个非常大的列表,并使用UPDATE对其某些成员进行更改。

有没有办法在每次迭代时提交这些更改,而不是在函数执行结束时?它允许我在短时间内运行该函数,每次运行时进行小的更改。

谢谢,

亚当

2 个答案:

答案 0 :(得分:3)

不,目前不支持在存储过程中打开或关闭事务,编号

如果确实如此,顺便说一句,在每次迭代后提交将使事情变得更慢。您必须至少批量提交10,000或100,000次更新。正如在评论中所说的那样,真正的胜利当然不是运行这种ISAM风格,而是要找出将其作为单个查询编写的一些方法。

答案 1 :(得分:1)

每个声明都有一个成本,所以如果你可以写你的 能做更少的陈述,你最好......

FOR all IN (select * from TABLE1)
LOOP
    FOR some IN (select * from)
    LOOP
        INSERT INTO TABLE2 VALUES (all.id, some.id)
    END LOOP
END LOOP

用一个INSERT语句替换整个循环:

INSERT INTO TABLE2 SELECT all.id, some.id FROM all, some WHERE...

但请注意您要更新的列表大小。 我们遇到了类似的问题,我们必须动态创建大量表并在其中插入大量数据。首先,我们创建一个存储过程并循环几个月和几年的列表,并为每个月创建一个表,但它在一个存储过程中崩溃。 所以,我们创建存储过程,但是我们不在那里循环,而是在存储过程之外循环并且它可以工作。