gpt4 book ai didi

python - 在长时间的数据库扫描期间发出定期提交是否有性能损失?

转载 作者:行者123 更新时间:2023-11-29 14:26:10 25 4
gpt4 key购买 nike

使用 Postgres 和 sqlalchemy。

我有一个作业扫描一个大表,并对每一行进行一些计算并更新一些相关表。有人告诉我,我应该在循环内发出定期提交,以免保留大量内存数据。我想知道这样的提交会有性能损失,例如重新启动事务,可能拍摄数据库快照等。

在这种情况下使用 flush() 会更好吗?

最佳答案

打开的事务不会在内存中保留大量数据。

您得到的建议可能来自习惯使用 Oracle 的人,其中大型事务会导致 UNDO 出现问题。

问题是如何扫描大表:

  • 如果您将大表 snar 到客户端,然后更新相关表,那么您是否在两者之间提交都无关紧要。

  • 如果您使用游标来扫描大表(这通常更好),如果您希望游标跨事务工作,则必须创建一个 WITH HOLD 游标。这样的游标是在数据库服务器端实现的,因此会使用更多的数据库资源。

    另一种方法是对大表使用查询,只获取表的一部分并以这种方式分块操作。

也就是说,一笔大交易可能比许多小交易更好或更差的原因有:

大笔交易的理由:

  • 您可以使用普通游标扫描大表,而不必费心使用 WITH HOLD 游标或上述替代方法。

  • 您将获得整个操作的交易保证。例如,您可以在错误和回滚后简单地重新启动操作。

批量操作的理由:

  • 较短的事务减少了死锁的风险。

  • 较短的事务允许 autovacuum 在处理后面的批处理时清除前面批处理的影响。如果更新导致大量数据流失,这是一个显着的优势,因为它有助于保持表膨胀较小。

最佳选择取决于实际情况。

关于python - 在长时间的数据库扫描期间发出定期提交是否有性能损失?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57654621/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com