何时提交更改?
使用通过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作业以在一周后删除它们(如果没有人抱怨该应用程序),这意味着如果出了问题,我有一个星期的时间来纠正错误。
回答
除了减少提交频率外,还应该考虑执行批量更新,而不是单个更新。