最好在循环内部或外部提交?

时间:2010-10-08 17:25:01

标签: database

也许对这个问题没有简单的答案,但我会问,如果有人,如果不是一个简单的答案,至少是一个见解。

我曾经多次创建一个循环,它遍历执行某些更新的数据库表中的许多记录,并且我可以在最后合法地执行一次大提交,或者在我处理它时提交每个记录。即,一次提交一个不会产生任何数据完整性问题。

是否有明确的案例哪个更好?

让我想到的是,我有一个这样的程序,我最近从一个大的提交切换到一堆小提交,因为它是一个相当长的运行程序 - 大约80分钟 - 它失败了一半通过糟糕的数据。我修复了问题并重新运行,但是当我可以让它处理以前未处理的记录时,它必须从头开始重新开始。

我注意到,当我做出这个改变时,运行时间大致相同。

3 个答案:

答案 0 :(得分:3)

假设不需要回滚整个持久性的能力(在这种情况下只有一个答案;在外部提交),在循环内部提交会使事务日志更小,但需要更多往返数据库。在循环之外提交恰恰相反。哪个更快取决于平均操作计数和总体提交的数据量。对于持续大约10-20条记录的例程,在循环外部进行提交。对于1m-2m的记录,我会批量提交。

答案 1 :(得分:1)

我认为答案是,如果一个失败,你需要回滚所有内容吗?如果是,请将交易置于外部,否则将其置于内部。当然,除了处理相当大批量的记录之外,我几乎从不写一个循环来进行更新。如果您正在进行逐行更新,那么有更好,更高效的方法。

答案 2 :(得分:0)

就性能而言,通常最好在最后进行一次大提交(让网络流量通常少用于数据库)。

这当然取决于许多因素,例如表格上的索引,数据量等等。

应该推动您的决定是每次更新的重要性 - 它本身应该是一项交易吗?许多项目的更新是否有意义?如果循环中途失败会发生什么?

回答这些问题将为您提供在该流程的应用程序中执行此操作的正确方法 - 您可能会根据应用程序上下文以不同的方式处理提交。