PostgreSQL存储过程中的提交

PostgreSQL存储过程中的提交,postgresql,stored-procedures,commit,Postgresql,Stored Procedures,Commit,我有一个PostgreSQL存储过程,它在一个非常大的列表上循环,并使用UPDATE对它的一些成员进行更改 是否有一种方法可以在每次迭代中提交这些更改,而不是在函数执行结束时提交?它允许我在短时间内运行函数,每次运行时都会做一些小的更改 谢谢 Adam否,当前不支持在存储过程中打开或关闭事务,否 如果它这样做了,顺便说一句,在每次迭代后提交将使事情变得慢得多。您必须至少批量提交10000或100000次更新。正如评论中所说,真正的胜利当然不是运行这种ISAM风格,而是找到某种方法将其作为一个查询

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

是否有一种方法可以在每次迭代中提交这些更改,而不是在函数执行结束时提交?它允许我在短时间内运行函数,每次运行时都会做一些小的更改

谢谢


Adam

否,当前不支持在存储过程中打开或关闭事务,否


如果它这样做了,顺便说一句,在每次迭代后提交将使事情变得慢得多。您必须至少批量提交10000或100000次更新。正如评论中所说,真正的胜利当然不是运行这种ISAM风格,而是找到某种方法将其作为一个查询来编写。

每个语句都有成本,因此如果您可以编写 函数来做更少的语句,你最好

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
语句,而不是在
游标中或通过其他方法循环整个列表。在您的场景中,这是不可能的吗?可能是,但我仍然对这个问题感到好奇。从PostgreSQL 11开始,可以使用a而不是函数,并且允许过程提交。非常感谢,我可能会改变我的方法。