2010-02-16 40 views
1

我正在使用oracle中的MERGE語句對數百萬條記錄進行批量插入/更新。那麼,其他選項可能是使用FORALL使用BULKCOLLECT,然後提交,但此操作將再次減慢性能,因爲我需要保持循環。 在整個合併操作完成後提交將是一個性能問題,我想知道如何將合併語句中的提交頻率設置爲10000行插入/更新(如批量提交)。如何在Oracle Merge Statement中指定批量提交?

回答

3

MERGE語句是一個單一語句,因此根據定義它不能跨越事務。 (ACID中的A代表原子性)

如果您沒有對源表和目標表的合併標準(ON子句)的索引,將單個MERGE語句轉換爲N個合併語句將要運行速度明顯較慢,因爲當您針對源和/或目標進行單次掃描時,您將會執行其中的N個掃描。如果您認爲一次全表掃描速度很慢,請嘗試每百萬行做100次!

說實話,拿刀砍你的單一合併到多個語句將是慢,因爲更多的工作正在做 - 你運行多個語句,因此有更多的分析開銷,您要執行更多的提交,所以會有更多的序列化,因爲當執行提交時你的程序正在等待。將單一語句劃分爲多個單詞的唯一好理由是,如果您有可恢復性問題(噢,不!工作失敗三個小時,我們只有四個小時的時間!),或者如果事務管理開銷(UNDO和ORA-01555 )成爲一個問題。

如果您在此過程中擁有CPU可用性,那麼您可能希望考慮對您的MERGE語句使用PARALLEL提示以查看它是否運行得更快。同樣,如果您的MERGE語句僅影響目標表中的一小部分行,則可能是合併的列上的索引會提高性能。

+0

亞當,非常感謝您的有價值的答案! – spaceman

-1

您無法對單個合併語句進行批量提交。