我正在使用 oracle 中的 MERGE 语句对数百万条记录进行批量插入/更新。好吧,其他选项可能是使用 FORALL 并利用 BULKCOLLECT 然后提交,但是此操作将再次降低性能,因为我需要保持循环。在完成整个合并操作后提交将影响性能,我想知道如何将提交频率放在合并语句中,以便每说 10000 行插入/更新,例如批量提交。
问问题
7929 次
2 回答
4
MERGE 语句是一个单一的语句,因此根据定义,它不能跨越事务。(ACID 中的 A 代表原子性。)
如果源表和目标表的合并条件(ON 子句)上都没有索引,则将单个 MERGE 语句转换为 N 个合并语句的运行速度会明显变慢,就像您对任一表执行单个扫描时一样源和/或目标,你将要做其中的 N 个。如果您认为一次全表扫描很慢,请尝试每百万行扫描 100 次!
老实说,随着更多工作的完成,将单个 MERGE 分割成更多语句会更慢 - 你运行更多语句,因此解析开销更大,并且执行更多提交,所以会有进行更多的序列化,因为您的程序在执行提交时等待。将单个语句划分为多个语句的唯一充分理由是,如果您有可恢复性问题(哦不!作业在三个小时内失败,而我们只有四个小时的窗口!)或者事务管理开销(UNDO 和 ORA-01555 的) 成为一个问题。
如果您有此进程的 CPU 可用性,您可能希望考虑对您的 MERGE 语句使用 PARALLEL 提示以查看它是否运行得更快。类似地,如果您的 MERGE 语句只影响目标表中的一小部分行,那么合并所针对的列上的索引可能会提高性能。
于 2010-02-16T15:44:52.890 回答
-1
您不能对单个合并语句进行批量提交。
于 2013-06-05T11:54:30.183 回答