2011-07-25 56 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外部例程做到这一点,你可能要认真思考一下为什么它是你需要做...