代码之家  ›  专栏  ›  技术社区  ›  Pat

何时提交更改?

  •  4
  • Pat  · 技术社区  · 16 年前

    使用通过PerlDBI访问的Oracle10g,我有一个表,表中的几千万行每秒更新几次,而从另一个进程中读取的数据更为频繁。

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

    我有几个问题:

    • 这是更快还是更慢,还是取决于(计划一旦能够得到新负载的适当模拟,就对双向进行基准测试)
    • 为什么它会帮助/阻碍性能。
    • 如果“取决于……”,取决于什么?
    • 如果它有帮助,n的最佳值是什么?
    • 为什么我的本地DBA在我需要时不能给出一个有帮助的直接答案?
      (实际上我知道答案):-)

    编辑:

    @codeslave:谢谢,btw输了 未限制的更改不是问题,我 不要删除使用的原始数据 更新直到我确定一切 很好,顺便说一下,清洁女工做的。 拔下服务器插头,两次:-)

    一些谷歌搜索显示可能有帮助 因为与回滚相关的问题 但我还是不知道 每十位数N的经验法则? 数以百计?千?

    @迪丘:好消息,我一定会的 看看那个。

    6 回复  |  直到 6 年前
        1
  •  3
  •   Community trashgod    9 年前

    提交会导致Oracle向磁盘写入内容,即在重做日志文件中,以便在电源故障等情况下,提交的事务所做的任何操作都可以恢复。 在文件中写入比在内存中写入慢,因此如果对一行中的许多操作执行提交,而不是对一组合并的更新执行提交,则提交速度会慢一些。

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

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

        2
  •  1
  •   stevechol    16 年前

    减少提交的频率当然会加快速度,但是由于您经常读写此表,因此可能存在锁定的可能性。只有您可以确定同时更新相同数据的可能性。如果发生这种情况的可能性很低,则每50行提交一次,并监视情况。恐怕是试错法:-)

        3
  •  1
  •   David Aldridge    16 年前

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

        4
  •  0
  •   BIBD    16 年前

    如果“在确定一切正常之前不要删除用于更新的原始数据”,那么为什么不删除中间的所有增量提交,如果有问题,则回滚?听起来您实际上已经在事务之上构建了一个事务系统。

        5
  •  0
  •   Pat    16 年前

    @codeslave您的问题由@stevechol回答,如果我删除所有增量提交,就会有锁。我想如果没有更好的办法,我会按照他的建议,随机挑选一个数字,监控负载并相应地调整。应用@diiu twaks时。

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

        6
  •  0
  •   Jason Plank dvancouver    13 年前

    更快/更慢?

    可能会快一点。但是,如果发生灾难性的事情(清理人员拔掉服务器的插头)、fud、fire、brimstone等,您将面临更大的陷入死锁、丢失未提交的更改的风险。

    为什么会有帮助?

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

    DBA和直接答案?

    如果简单的话,你就不需要了。