【问题标题】:COMMIT in PostgreSQL stored procedure [duplicate]PostgreSQL 存储过程中的 COMMIT [重复]
【发布时间】:2011-01-19 07:28:26
【问题描述】:

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

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

谢谢,

亚当

【问题讨论】:

  • 真正的性能优化是使用单个update 语句,而不是在cursor 中或通过其他方法循环整个列表。这在您的场景中是不可能的吗?
  • 可能是这样,但我还是很好奇这个问题。
  • 从 PostgreSQL 11 开始,可以使用 PROCEDURE 代替 FUNCTION,并且允许提交过程。

标签: postgresql stored-procedures commit


【解决方案1】:

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

如果确实如此,顺便说一句,在每次迭代后提交会使事情变得更慢。您必须至少分批提交 10,000 或 100,000 次更新。正如 cmets 中所说,真正的胜利当然不是运行这种 ISAM 样式,而是想办法将其编写为单个查询。

【讨论】:

  • 非常感谢,我可能会改变我的方法。
【解决方案2】:

每条语句都有成本,所以如果你能写出你的 函数做更少的语句,你最好...

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

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-09-07
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多