【问题标题】:How to minimize transaction overhead in Oracle?如何最小化 Oracle 中的事务开销?
【发布时间】:2008-11-03 21:00:45
【问题描述】:

我必须同时将数据加载到表中并对其运行查询。由于数据性质,我可以用完整性换取性能。如何最大限度地减少事务的开销?

很遗憾,不能使用 MySQL 等替代方案(由于非技术原因)。

【问题讨论】:

    标签: performance oracle transactions


    【解决方案1】:

    除了适用于所有数据库的一般优化做法(例如消除全表扫描、删除未使用或低效的索引等)之外,您还可以做一些事情。

    1. No Archive Log 模式下运行。这会牺牲可恢复性来换取速度。
    2. 对于插入,请使用/*+ APPEND */ hint。这会将数据放入不会创建 UNDO 的高水位线上方的表格中。缺点是没有使用现有的可用空间。
    3. 在硬件方面,RAID 0 在大量较小的磁盘上将为您提供最佳插入性能,但根据您的使用情况,RAID 10 具有更好的读取性能可能会提供更好的匹配。

    也就是说,我认为您不会从这些变化中获得太多收益。

    【讨论】:

      【解决方案2】:

      也许我遗漏了一些东西,但由于在 Oracle 中读取器不会阻止写入器,写入器不会阻止读取器,那么您要解决的问题到底是什么?

      从正在读取数据的会话的角度来看,正在执行插入操作的会话并没有真正增加任何开销(更新可能会增加一些开销,因为读者必须按顺序查看 UNDO 表空间中的数据重建数据的读取一致视图)。从插入数据的会话的角度来看,进行读取的会话并没有真正增加任何开销。当然,您的系统作为一个整体可能存在瓶颈,导致各种会话争用资源(即,如果您的插入使用了 100% 的可用 I/O 带宽,这将减慢必须执行的查询物理 I/O),但这与不同会话正在执行的操作类型没有直接关系——您可以像使用一堆插入会话一样容易地用一堆报告用户淹没一个 I/O 子系统.

      【讨论】:

      • 我同意——这听起来像是一个假设的问题。该软件旨在做到这一点。
      • 您的解释包括答案——当没有人关心完整性时,为什么要花费资源(内存、I/O、CPU)进行 UNDO 查找?我更喜欢使用它们来提高查询性能
      • 当您说“将数据加载到表中”时,很自然的假设是您在谈论插入,这不会导致读者做任何额外的工作来应用 UNDO。只有当您的加载过程正在更新读者正在阅读的行时,这才会发挥作用——是这样吗?
      【解决方案3】:

      您希望事务隔离读取未提交。我不推荐它,但这就是你要求的:)

      这将允许您破坏事务隔离并读取未提交的插入数据。

      请阅读这篇 Ask Tom 文章:http://www.oracle.com/technology/oramag/oracle/05-nov/o65asktom.html

      更新:我实际上弄错了,Oracle 并不真正支持读取未提交的隔离级别,他们只是提到它:)。

      【讨论】:

      • 如本文所述,Oracle 在技术上不支持 READ UNCOMMITTED,仅支持其精神。
      【解决方案4】:

      您是否尝试禁用表中的所有约束,然后插入所有数据,然后再次启用它们?

      即更改会话集约束=延迟;

      但是,如果您在表创建期间没有将表中的约束设置为可延迟,则可能会出现一些小问题。

      【讨论】:

        【解决方案5】:

        您关注什么样的性能量?插入是成批的还是许多小的?

        在拼命想办法获得良好性能之前,您是否创建了任何简单的原型,可以让您更好地了解开箱即用的性能?很容易证明你不需要做任何特别的事情来实现目标。

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 2012-03-15
          • 2013-06-28
          • 2014-09-12
          • 1970-01-01
          • 2016-09-01
          • 2011-03-25
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多