2010-10-08 71 views
4

也許這個問題沒有簡單的答案,但是我要求如果有人有,如果不是簡單的答案,至少有一個見解。更好的提交內部或外部循環?

我已經有很多場合創建一個循環,通過數據庫表中的許多記錄執行某些更新,並且我可以合法地在最後做一個大提交,或者在我處理時提交每條記錄它。即一次提交一個不會產生任何數據完整性問題。

有明確的情況哪個更好?

讓我想起的是,我有一個這樣的程序,我最近從一個大的提交切換到一堆小提交,因爲它是一個相當長的運行程序 - 大約80分鐘 - 它失敗了一半通過壞數據的方式。我解決了這個問題並重新運行了,但是當它能夠處理先前未處理的記錄時,它必須從一開始就重新開始。

我注意到當我做出這個改變時,運行時間差不多一樣。

回答

3

假設不需要回滾整個持久性的能力(在這種情況下只有一個答案;在外部提交),在循環內部提交會保持事務日誌更小,但需要更多往返數據庫。在循環之外承諾是完全相反的。哪個更快取決於整體的平均操作次數和數據量。對於保存10-20條記錄的例程,在循環之外提交。對於1米-2米的記錄,我會分批進行。

1

我認爲答案是你需要回滾所有,如果一個失敗?如果是的話,把交易放在外面,否則放進去。當然,我幾乎從不會編寫循環來進行更新,除非處理相當大批的記錄。如果你正在逐行更新,那麼有更好的,更高性能的方法。

+0

我不確定你的意思是「永遠不會寫一個循環來進行更新,除非處理相當大的批次」。嗯,而不是什麼?如果我只有一個記錄要更新,當然我不會有循環。 – Jay 2010-10-08 17:40:37

+0

是的,如果整個更新必須被視爲一個單一的事務,如果只有一部分完成將導致不一致的數據,當然提交必須在外面。我在想,從邏輯的角度來看,這並不重要。 – Jay 2010-10-08 17:41:53

+0

與基於集合的更新相反。如果你有100條記錄需要更新,那麼他們可以在99.9%的時間內完成一次無循環更新,並且應該這樣做。 Daatbase不適合逐行操作。 – HLGEM 2010-10-08 18:04:22

0

就性能而言,通常最好在最後做一個大的提交(讓網絡流量,通常對數據庫工作較少)。

當然,這取決於許多因素,如餐桌上的索引,數據量等

應該怎樣駕駛你的決定是每個更新多麼重要是 - 它應該是在一個事務和它自己?很多項目的更新是否有意義?如果循環中途失敗會發生什麼?

回答這些問題將爲您在該過程的應用程序中執行此操作提供正確的方法 - 您可能以不同的方式根據應用程序上下文來處理提交。

相關問題