【发布时间】:2008-11-03 21:00:45
【问题描述】:
我必须同时将数据加载到表中并对其运行查询。由于数据性质,我可以用完整性换取性能。如何最大限度地减少事务的开销?
很遗憾,不能使用 MySQL 等替代方案(由于非技术原因)。
【问题讨论】:
标签: performance oracle transactions
我必须同时将数据加载到表中并对其运行查询。由于数据性质,我可以用完整性换取性能。如何最大限度地减少事务的开销?
很遗憾,不能使用 MySQL 等替代方案(由于非技术原因)。
【问题讨论】:
标签: performance oracle transactions
除了适用于所有数据库的一般优化做法(例如消除全表扫描、删除未使用或低效的索引等)之外,您还可以做一些事情。
No Archive Log 模式下运行。这会牺牲可恢复性来换取速度。/*+ APPEND */ hint。这会将数据放入不会创建 UNDO 的高水位线上方的表格中。缺点是没有使用现有的可用空间。RAID 0 在大量较小的磁盘上将为您提供最佳插入性能,但根据您的使用情况,RAID 10 具有更好的读取性能可能会提供更好的匹配。也就是说,我认为您不会从这些变化中获得太多收益。
【讨论】:
也许我遗漏了一些东西,但由于在 Oracle 中读取器不会阻止写入器,写入器不会阻止读取器,那么您要解决的问题到底是什么?
从正在读取数据的会话的角度来看,正在执行插入操作的会话并没有真正增加任何开销(更新可能会增加一些开销,因为读者必须按顺序查看 UNDO 表空间中的数据重建数据的读取一致视图)。从插入数据的会话的角度来看,进行读取的会话并没有真正增加任何开销。当然,您的系统作为一个整体可能存在瓶颈,导致各种会话争用资源(即,如果您的插入使用了 100% 的可用 I/O 带宽,这将减慢必须执行的查询物理 I/O),但这与不同会话正在执行的操作类型没有直接关系——您可以像使用一堆插入会话一样容易地用一堆报告用户淹没一个 I/O 子系统.
【讨论】:
您希望事务隔离读取未提交。我不推荐它,但这就是你要求的:)
这将允许您破坏事务隔离并读取未提交的插入数据。
请阅读这篇 Ask Tom 文章:http://www.oracle.com/technology/oramag/oracle/05-nov/o65asktom.html。
更新:我实际上弄错了,Oracle 并不真正支持读取未提交的隔离级别,他们只是提到它:)。
【讨论】:
您是否尝试禁用表中的所有约束,然后插入所有数据,然后再次启用它们?
即更改会话集约束=延迟;
但是,如果您在表创建期间没有将表中的约束设置为可延迟,则可能会出现一些小问题。
【讨论】:
您关注什么样的性能量?插入是成批的还是许多小的?
在拼命想办法获得良好性能之前,您是否创建了任何简单的原型,可以让您更好地了解开箱即用的性能?很容易证明你不需要做任何特别的事情来实现目标。
【讨论】: