何时提交更改?

时间:2020-03-05 18:44:37  来源:igfitidea点击:

使用通过Perl DBI访问的Oracle 10g,我得到了一个表,该表具有每秒几千万行的数据,每秒被更新几次,而从另一个过程中读取的频率则更高。

不久,更新频率将增加一个数量级(可能是两个)。
有人建议,每执行N次更新而不是每次更新后进行提交,将有助于提高性能。

我有几个问题:

  • 是更快还是更慢还是取决于(计划在尽快获得新负载的合理模拟时进行双向基准测试)
  • 为什么它会帮助/阻碍性能。
  • 如果"取决于...",那又是什么?
  • 如果有帮助,N的最佳值是多少?
  • 为什么当我需要本地DBA时,我不能提供一个有用的直接答案? (实际上我知道答案):-)
EDIT:
  
  @codeslave : Thanks, btw losing
  uncommited changes is not a problem, I
  don't delete the original data used
  for updating till I am sure everything
  is fine , btw cleaning lady did
  unplugs the server, TWICE :-)
  
  Some googling showed it might help
  because of issue related to rollback
  segments, but I still don't know a
  rule of thumb for N every few tens ?
  hundreds? thousand ?
  
  @diciu : Great info, I'll definitely
  look into that.

解决方案

回答

Faster/Slower?

可能会快一点。但是,如果遇到灾难性事件(清洁女工拔下服务器的电源),FUD,Fire,Brimstone等,发生死锁,丢失未提交的更改的风险就更大。

Why would it help?

显然更少的提交操作,这反过来意味着更少的磁盘写操作,等等。

DBA's and straight answers?

如果很简单,则不需要一个。

回答

提交会导致Oracle将东西写入磁盘,即在重做日志文件中,以便在断电等情况下可以恢复正在提交的事务。
写文件比写内存慢,因此,如果连续执行多个操作而不是合并合并的更新,则提交的速度将较慢。

在Oracle 10g中,有一个异步提交,使提交速度更快,但可靠性更低:https://web.archive.org/web/1/http://articles.techrepublic%2ecom%2ecom/5100-10878_11-6158695.html

PS我肯定知道,在某些应用程序中看到的情况下,将合并更新的数量从5K更改为50K会使它更快一个数量级(快10倍)。

回答

减少提交的频率肯定会加快处理速度,但是当我们频繁地对该表进行读写操作时,就有可能发生锁定。只有我们可以确定同时更新相同数据的可能性。如果发生这种情况的机会很小,请每50行提交一次并监视情况。试错我怕:-)

回答

如果我们"在确定一切正常之前才删除用于更新的原始数据",那么为什么不删除它们之间的所有这些增量提交,如果有问题又回滚呢?听起来我们实际上已经在交易之上构建了交易系统。

回答

@CodeSlave问题由@stevechol回答,如果我删除所有增量提交,将有锁。我想如果没有更好的办法了,我会按照他的建议选择一个随机数,监视负载并进行相应调整。在应用@diciu twaks时。

PS:事务之上的事务只是偶然的,我通过FTP获取用于更新的文件,而不是立即删除它们,而是设置了cron作业以在一周后删除它们(如果没有人抱怨该应用程序),这意味着如果出了问题,我有一个星期的时间来纠正错误。

回答

除了减少提交频率外,还应该考虑执行批量更新,而不是单个更新。