我有一个PostgreSQL存储过程,它循环遍历一个非常大的列表,并使用UPDATE
对其某些成员进行更改。
有没有办法在每次迭代时提交这些更改,而不是在函数执行结束时?它允许我在短时间内运行该函数,每次运行时进行小的更改。
谢谢,
亚当
答案 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...
但请注意您要更新的列表大小。 我们遇到了类似的问题,我们必须动态创建大量表并在其中插入大量数据。首先,我们创建一个存储过程并循环几个月和几年的列表,并为每个月创建一个表,但它在一个存储过程中崩溃。 所以,我们创建存储过程,但是我们不在那里循环,而是在存储过程之外循环并且它可以工作。