何时提交更改?

时间:2008-08-28 19:40:55

标签: sql oracle commit

使用Oracle 10g,通过Perl DBI访问,我有一个数百万行的表每秒更新几次,同时从另一个进程中更频繁地读取。

很快,更新频率将增加一个数量级(可能是两个)。 有人建议在每次更新后提交每个N更新将有助于提高性能。

我有几个问题:

  • 这会更快还是更慢或者更依赖(计划一旦能够对新负载进行适当的模拟,就可以同时进行基准测试)
  • 为什么它会帮助/阻碍表现。
  • 如果“这取决于......”,关于什么?
  • 如果它有助于N的最佳价值?
  • 为什么当我需要时,我的本地DBA不能直接回答?
    (实际上我知道那个答案):-)
  

编辑:

     

@codeslave:谢谢,顺便一提   不公正的变化不是问题,我   不要删除使用的原始数据   更新,直到我确定一切   很好,顺便说一下清洁女工呢   拔掉服务器,TWICE: - )

     一些谷歌搜索显示它可能会有所帮助   因为与回滚有关的问题   细分,但我还是不知道   每隔几十个N的经验法则?   数百?千?

     

@diciu:很好的信息,我肯定会   看看那个。

6 个答案:

答案 0 :(得分:3)

提交会导致Oracle将内容写入磁盘 - 即在重做日志文件中,以便在发生电源故障时,无论提交的事务是什么,都可以恢复。 在文件中写入比在内存中写入要慢,因此如果连续执行许多操作而不是一组合并更新,则提交会更慢。

在Oracle 10g中,存在异步提交,使其更快但更不可靠:https://web.archive.org/web/1/http://articles.techrepublic%2ecom%2ecom/5100-10878_11-6158695.html

PS我确实知道,在我在某个应用程序中看到的场景中,将合并更新的数量从5K更改为50K会使其更快一个数量级(快10倍)。

答案 1 :(得分:1)

减少提交的频率肯定会加快速度,但是当你经常读写这个表时,就有可能发生锁定。只有您可以确定同时更新相同数据的可能性。如果这种可能性很低,则每50行提交一次并监控情况。试验和错误我害怕: - )

答案 2 :(得分:1)

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

答案 3 :(得分:0)

  

快/慢?

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

  

为什么会有帮助?

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

  

DBA和直接答案?

如果这很容易,你就不需要了。

答案 4 :(得分:0)

如果你“删除用于更新的原始数据,直到你确定一切正常”,那么为什么不删除其间的所有增量提交,如果出现问题则回滚?听起来你有效地在交易之上建立了一个交易系统。

答案 5 :(得分:0)

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

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