【问题标题】:Maximum transaction size in PostgreSQLPostgreSQL 中的最大事务大小
【发布时间】:2010-10-17 02:51:59
【问题描述】:

我的应用程序中有一个实用程序,我需要在其中执行插入、更新和删除操作的批量加载。我正在尝试围绕此创建事务,以便一旦调用此系统并将数据提供给它,就可以确保它要么全部添加到数据库中,要么没有添加到数据库中。

关心的是这里的边界条件是什么?一笔交易可以有多少个 INSERT、UPDATE 和 DELETE?交易大小是否可配置?

【问题讨论】:

    标签: database postgresql transactions


    【解决方案1】:

    我认为事务中可以执行的工作量没有上限。数据不断添加到表文件中,最终事务要么提交要么回滚:AIUI 这个结果存储在 pg_clog 中;如果它回滚,空间最终会被真空回收。因此,例如,正在进行的事务工作并不是保存在内存中并在提交时刷新。

    【讨论】:

    • 这只是部分正确。每个事务内部都有一个命令计数器,用于处理事务内部的可见性。这是一个 32 位数字,如果您有非常大的事务(数十亿条命令),最终会溢出。 VACUUM、pg_clog 等只处理系统中的事务总数,而不是其中一个事务中发生的事情。
    • @MagnusHagander 这个 32 位数字仍然成立吗?此号码是否已更新为 64 位?
    • @MagnusHagander 如果我正确理解您的说明,v10 之前的 pg_clog(以及现在的 pg_xact)仅包含命令计数器之类的事务元数据,无论是否交易尚未提交。这就是我在快速测试中看到的。答案让我觉得只有在提交后才会将数据移动到 wal 文件中
    • 所以在我的 .sql 文件中,我可以执行以下操作:- begin; lots of insert sql statements (around 2 million insert statements); commit;
    【解决方案2】:

    单个事务可以在其中运行大约 20 亿条命令(2^31,减去 IIRC 一点点开销。实际上,想想看,可能是 2^32 - 我认为命令计数器是无符号的)。

    当然,每个命令都可以修改多行。

    【讨论】:

      【解决方案3】:

      对于我从事的一个项目,我执行了 2000 万次 INSERT。我尝试了一笔大交易,每百万 INSERT 交易一笔,性能似乎完全一样。

      PostgreSQL 8.3

      【讨论】:

      • 系统是本地的吗?我认为在延迟是一个因素的系统上执行此操作,性能会有所不同。
      • 您的程序的性能没有差异。但是其他用户的表现呢?
      【解决方案4】:

      我相信最大工作量受您的日志文件大小的限制。数据库永远不会让自己无法回滚,因此如果您在事务期间消耗所有日志空间,它将停止,直到您给它更多空间或回滚。这对所有数据库都是如此。

      我建议将您的更新分成可管理的块,最多需要几分钟的执行时间,这样您就可以更早地知道是否存在问题(例如,通常需要 1 分钟的内容在 10 分钟后仍在运行......嗯,有人删除了索引吗?)

      【讨论】:

      • 这不适用于 PostgreSQL。我们可以在事务运行期间回收日志空间。如果你正在做归档日志,你显然需要归档位置的空间,但对于本地事务日志,这不是必需的。 (当然,您将需要实际的磁盘空间来存储磁盘上的数据)。
      猜你喜欢
      • 2016-11-05
      • 2011-02-13
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-11-16
      相关资源
      最近更新 更多