【问题标题】:How often to I commit in Oracle我在 Oracle 中提交的频率
【发布时间】:2014-07-01 16:27:50
【问题描述】:

我正在从大型 Oracle 数据库中删除大量数据。我遵循的过程是我删除了一个记录表 A,导致表 B 上的 CASCADE 删除,而表 B 上的 CASCADE 删除在其他一些表上。所以基本上有几个表是通过 CASCADE delete 相互关联的。

目前,此过程在表 A 中的许多记录的迭代中起作用,并且我仅在迭代的最后(当所有数据都被删除时)提交。该过程大约需要 30 小时才能完成。

有人建议我进行常规 COMMIT,即为表 A 的每个记录删除(包括删除子表中的任何后续记录)执行一次 COMMIT。

我知道定期提交会保持较低的撤消日志大小,但是定期提交是否有任何性能改进?我会看到完成脚本所需的时间有所改善吗?

【问题讨论】:

  • 撤消日志是一个问题,但在我看来,主要权衡是DELETE 脚本可能失败的可能性与COMMITting 每条记录的开销。我建议在某批记录为DELETEd 之后COMMIT 可能是个好主意。如果您的 DELETE 脚本失败,那么您可以使用失败的批处理重新启动,而不必 ROLLBACK 整个庞大的事务。
  • 建议它的同事如何回答这些问题,为什么?
  • 我发现this article 很有趣。它甚至表明常规的COMMIT 会导致更大的重做文件,尽管这与 9i 有关,而我在 10g 上这样做

标签: sql database oracle oracle11g oracle10g


【解决方案1】:

预计频繁提交不会提高代码的性能。执行大量临时提交可能会迫使您花费更多时间等待同步操作,从而减慢您的代码速度。如果你在中间提交,你可能需要编写相当多的代码来确保你的代码是完全可重新启动的。

您是否有 AWR 或 statspack 快照或跟踪文件来显示您实际在等待什么? 30小时做任何事情似乎不合理。这将导致我强烈怀疑您缺少一些索引,这些索引导致您的级联删除在每次删除一行时都进行全表扫描。修复丢失的索引或执行多行删除以减少执行全表扫描的频率似乎比担心何时提交更改更有可能提高性能。

【讨论】:

  • 对于您评论的第一部分,我不同意您的看法。如果删除时间为 30 小时,则在批处理期间执行一些中间提交是一个很好的解决方案。在此期间发生事件(撤消,断开连接..)的可能性很高,并且回滚将是巨大的。做一些提交不会提高或降低性能,但会保护它。
  • @eliatou - 假设您编写代码以使您的进程可重新启动,那么在 30 小时的过程中进行临时提交当然是正确的,如果它在中间。不过,这与我所说的并不矛盾。它不会提高代码的性能,在一般情况下会增加一点点损失。当然,这个惩罚可能是值得的,但这是一个惩罚。不过,30 小时让我觉得非常不正常,以至于在考虑增加可重启性之前,我会专注于调整它。
  • 感谢@JustinCave 和 eliatou。我没有 AWR 报告,但您的建议是有道理的。关于索引,大多数表都已正确编入索引,但我很少有基于外键的表复合主键,并且该列中的每一列都单独编入索引(表没有没有它自己的主键)。这些是大表,我注意到即使从该表中选择数据也需要很长时间(即加载所有数据需要几个小时)。所以我想知道这是否会导致延迟。
  • 不管怎样,我已经添加了一些提交并再次运行脚本,所以让我们看看需要多长时间。
猜你喜欢
  • 2018-02-13
  • 2010-11-05
  • 1970-01-01
  • 2023-04-11
  • 2019-09-01
  • 1970-01-01
  • 2010-12-01
  • 1970-01-01
  • 2016-07-09
相关资源
最近更新 更多