2014-11-01 44 views
-1

我有一個代碼,其中有循環來處理數百萬條記錄。代碼如下所示:Oracle最好的方法來克服循環時間

FOR C1 
IN (SELECT a 
    FROM tbl1 
WHERE <some conditions>) 
LOOP 

/*Some processing which took less than a sec to process a record*/ 

/*Call to procedures and functions.*/ 

END LOOP; 

上面的循環代碼可以在4秒內處理大約9條記錄。我有數百萬條記錄來循環處理。

執行此任務的最佳方法是什麼? 我可以並行執行循環內的邏輯嗎?

+0

最好的方法是並聯,但必須在sql代碼之外進行。 – TomTom 2014-11-01 20:00:57

+0

您可以請更新我如何轉換此代碼的並列? – jaychapani 2014-11-01 20:02:58

+0

可以請你閱讀我寫的東西:例如:你不要在SQL中這樣做 - 你基本上打開多個連接並在select中過濾以不選擇全部(但是是每個連接中的一部分)。然後你可以並行地執行multipeol語句。 – TomTom 2014-11-01 20:04:36

回答

2

「我可以並行地在循環內執行邏輯嗎?」

誰能告訴?你沒有提供足夠的信息繼續下去。我的意思是說,驅動查詢很容易分成合適的塊。

並行性可能會有所幫助,但這絕不是保證。它取決於您擁有多少CPU,正在進行哪些其他工作,以及關鍵性的基礎過程的確切性質:如果即使其中一個「調用過程和函數」發出鎖,您也擁有了基本的串行過程。

「什麼是做這個任務的最佳方式

一般的建議是降低個人的時間爲每個記錄:

  1. 你需要以此爲逐行操作?使用純SQL的集合操作可能比PL/SQL循環快得多。同樣,這取決於你正在做什麼的具體細節。使用PL/SQL分析。 11g中的Oracle DBMS_HPROF tool對於準確定位所有時間點都是一個奇蹟。不幸的是,它需要一個DBA來授予訪問權限並創建一個目錄對象,但它絕對值得爲它提供一個RFC。 Find out more。 (在早期版本中有DBMS_PROFILER,這有點受限於仍然有用;它也需要DBA干預)。