我有一个PostgreSQL存储过程,它循环遍历一个非常大的列表,并使用UPDATE
对其某些成员进行更改。PostgreSQL存储过程中的COMMIT
有没有办法在每次迭代中提交这些更改,而不是在函数执行结束时提交?它可以让我在短时间内运行这个功能,在每次运行时都做一些小改动。
感谢,
亚当
我有一个PostgreSQL存储过程,它循环遍历一个非常大的列表,并使用UPDATE
对其某些成员进行更改。PostgreSQL存储过程中的COMMIT
有没有办法在每次迭代中提交这些更改,而不是在函数执行结束时提交?它可以让我在短时间内运行这个功能,在每次运行时都做一些小改动。
感谢,
亚当
不,它目前不支持存储过程中打开或关闭交易,没有。
如果是这样,顺便说一句,每次迭代后提交会让事情变得更慢。您必须至少分批提交10,000或100,000个更新。正如在评论中所说的,真正的胜利当然不是运行这种ISAM风格,而是想出一些方法来将它作为单个查询来编写。
非常感谢,我可能会改变我的做法。 – 2010-02-22 07:55:34
有每条语句有成本的,所以如果你可以写你的 功能少做报表,你最好......
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...
但是要小心你要更新的列表的大小。 我们有类似的问题,我们必须动态地创建大量表并在其中插入大量数据。首先,我们创建一个存储过程并循环遍历一个月和几年的列表,并为每个月创建一个表,但它会在单个存储过程中崩溃。 因此,我们创建了存储过程,但是我们并没有在那里循环,而是在存储过程之外循环并且它可以工作。
真正的性能优化是使用单个'update'语句,而不是遍历'cursor'中的整个列表或通过其他方法。这在你的情况下是不可能的? – yfeldblum 2010-02-21 16:46:17
这可能是,但我仍然对这个问题很好奇。 – 2010-02-21 17:01:48