现在我们用于插入记录集的过程是这样的:
(并注意“记录集”表示某人的记录及其地址,电话号码或任何其他已连接的表格。)
我们应该做更像这样的事吗?
在ORA-01555遇到一些问题并阅读一些Ask Tom文章(如this one)之后,我正在考虑尝试第二个过程。当然,正如Tom指出的那样,开始新的交易是应该由业务需求定义的。第二个过程值得尝试,还是一个坏主意?
答案 0 :(得分:5)
交易应该是一个有意义的工作单位。但是,工作单元的构成取决于具体情况。在OLTP系统中,工作单元将是一个人,以及他们的地址信息等。但听起来好像您正在实施某种形式的批处理,这会加载很多人。
如果您遇到ORA-1555的问题,几乎可以肯定是因为您有一个长时间运行的查询提供正由其他事务更新的数据。在循环内部进行提交有助于循环使用UNDO段,因此往往会增加您依赖提供读取一致性的段可能被重用的可能性。所以,不这样做可能是一个好主意。
是否使用SAVEPOINTs解决方案是另一回事。我不确定在你的情况下会给你带来什么好处。在使用Oracle10g时,您应该考虑使用批量DML error logging。
或者,您可能希望重写驱动查询,以便它可以处理较小的数据块。如果不了解您的流程细节,我无法提供具体的建议。但总的来说,不是打开10000个记录的一个光标,而是打开它20次,每次打开500行。另一件需要考虑的事情是,是否可以通过使用批量收集和FORALL来提高插入过程的效率。
答案 1 :(得分:1)
一些想法......