2010-02-21 346 views
3

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

有没有办法在每次迭代中提交这些更改,而不是在函数执行结束时提交?它可以让我在短时间内运行这个功能,在每次运行时都做一些小改动。

感谢,

亚当

+0

真正的性能优化是使用单个'update'语句,而不是遍历'cursor'中的整个列表或通过其他方法。这在你的情况下是不可能的? – yfeldblum 2010-02-21 16:46:17

+2

这可能是,但我仍然对这个问题很好奇。 – 2010-02-21 17:01:48

回答

3

不,它目前不支持存储过程中打开或关闭交易,没有。

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

+0

非常感谢,我可能会改变我的做法。 – 2010-02-22 07:55:34

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... 

但是要小心你要更新的列表的大小。 我们有类似的问题,我们必须动态地创建大量表并在其中插入大量数据。首先,我们创建一个存储过程并循环遍历一个月和几年的列表,并为每个月创建一个表,但它会在单个存储过程中崩溃。 因此,我们创建了存储过程,但是我们并没有在那里循环,而是在存储过程之外循环并且它可以工作。