2011-07-25 57 views
13

在Oracle DBMS中,性能更好的是,從另一個pl/sql存儲過程調用java存儲過程或從另一個pl/sql存儲過程調用pl/sql存儲過程。我的pl/sql過程中有一個循環會多次調用java過程(即我的代碼在PL/SQL和Java存儲過程之間翻轉),那麼這會減慢性能)?Java存儲過程與PL/SQL存儲過程

+4

我認爲從PL/SQL每次調用Java的涉及上下文切換,所以我猜這個運行非常緩慢。也許可以完全擺脫循環,但是如果沒有看到你的代碼,這是不可能的。 –

+0

謝謝弗蘭克,實際上我計算了以毫秒爲單位調用等效pl/sql過程的循環次數相同(600循環週期)的時間,結果幾乎沒有差別,除了它完成了提前100毫秒。 –

+1

我同意Frank的觀點,每次調用Java存儲過程(PL/SQL - > Java,然後再返回),都不可避免地會出現兩個上下文切換。如果被調用的過程是純PL/SQL(即沒有SQL訪問),那麼PL/SQL選項會更快(嘗試超過10000次迭代而不是600次)。另外,PL/SQL調用過程是否可以定義爲DETERMINISTIC?如果是這樣,如果你的循環中重複了任何參數,這可能會爲你節省一些時間。另外,你運行的是哪個版本的Oracle?如果它是11g,內聯功能應該使PL/SQL到PL/SQL的調用非常快。 – Ollie

回答

12

從一種語言切換到另一種語言會涉及開銷(可能很小,但仍然會在那裏)。如果它在一個循環中,它會被強調。

保持簡單,如果你可以堅持PL/SQL,那麼這樣做。

湯姆·凱特(Oracle公司副總裁兼師)有一個口頭禪,這似乎擬合在這裏重複:

(參考:http://tkyte.blogspot.com/2006/10/slow-by-slow.html

  • 你應該做一個單獨的SQL語句,如果在所有可能的。
  • 如果您不能在單個SQL語句中執行此操作,請在PL/SQL中執行此操作。
  • 如果您無法在PL/SQL中執行此操作,請嘗試使用Java存儲過程。
  • 如果你不能在Java中完成,那麼在C外部過程中執行它。
  • 如果你不能在C外部例程做到這一點,你可能要認真思考一下爲什麼它是你需要做...