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

时间:2008-11-03 21:00:45

标签: performance oracle transactions

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

不幸的是,不能使用像MySQL这样的替代品(由于非技术原因)。

5 个答案:

答案 0 :(得分:1)

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

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

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

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

答案 1 :(得分:1)

也许我错过了一些东西,但由于在Oracle读者不会阻止作家和作家不阻止读者,你究竟要解决的问题是什么?

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

答案 2 :(得分:1)

除了适用于所有数据库的一般优化实践,例如消除全表扫描,删除未使用或低效的索引等等,您可以执行以下操作。

  1. No Archive Log模式运行。这牺牲了速度的可恢复性。
  2. 对于插入,请使用/*+ APPEND */ hint。这将数据放在高水位线上方的表中,该水位线不会产生UNDO。缺点是不使用现有的自由空间。
  3. 在硬件方面,RAID 0通过大量较小的磁盘可以获得最佳的插入性能,但根据您的使用情况,RAID 10具有更好的读取性能可能更适合。< / LI>

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

答案 3 :(得分:1)

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

即。 alter session set constraints = deffered;

但是,如果您在表创建过程中未将表中的约束设置为可归因,则可能会出现轻微问题。

答案 4 :(得分:0)

您在看什么样的表现量?是插入批量还是许多小插件?

在试图想出聪明的方法来获得良好表现之前,你是否先碰到墙头,是否创造了任何简单的原型,让您更好地了解开箱即用的性能?很容易就会发现你不需要做任何特别的事情来实现目标。