代码之家  ›  专栏  ›  技术社区  ›  Dmitry Khalatov

如何在Oracle中最小化事务开销?

  •  1
  • Dmitry Khalatov  · 技术社区  · 16 年前

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

    5 回复  |  直到 16 年前
        1
  •  1
  •   Justin Cave    16 年前

    也许我遗漏了什么,但既然在Oracle中,读卡器不阻止写卡器,写卡器也不阻止读卡器,那么您要解决的问题到底是什么?

    从读取数据的会话的角度来看,执行插入的会话实际上并没有增加任何开销(更新可能会增加一些开销,因为读取器必须查看撤消表空间中的数据,以便重建数据的读取一致性视图)。从插入数据的会话的角度来看,执行读取的会话实际上并没有增加任何开销。当然,您的系统作为一个整体可能有一个瓶颈,导致各种会话争夺资源(即,如果您的插入占用了100%的可用i/O带宽,这将降低必须进行物理i/O的查询的速度),但这与不同会话正在执行的操作类型没有直接关系——您可以像插入会话一样轻松地向I/O子系统注入大量报告用户。

        2
  •  1
  •   Leigh Riffel    16 年前

    1. 磨合 No Archive Log 模式这牺牲了速度的可恢复性。
    2. 对于插入,请使用 /*+ APPEND */ hint . 这会将数据放入高水位线上方的表格中,该高水位线不会创建撤消。缺点是没有使用现有的可用空间。
    3. RAID 0 在较大数量的较小磁盘上,将提供最佳的插入性能,但这取决于您的使用情况 RAID 10 由于其更好的读取性能,可能会提供更好的拟合。

    也就是说,我认为你不会从这些变化中获得多少好处。

        3
  •  1
  •   Bogdan    16 年前

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

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

    请阅读这篇问汤姆的文章: http://www.oracle.com/technology/oramag/oracle/05-nov/o65asktom.html .

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

        4
  •  1
  •   Cosmin    13 年前

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

    但是,如果在创建表的过程中没有将表中的约束设置为defferable,则可能会出现一个小问题。

        5
  •  0
  •   Andrew not the Saint    16 年前

    您正在查看哪种性能卷?插入物是成批的还是大量的小插入物?

    在你试图想出聪明的方法来获得好的性能之前,你是否创建了一些简单的原型,让你更好地了解开箱即用的性能?结果很容易证明,你不需要做任何特殊的事情来实现目标。