Java存储过程与PL/SQL存储过程

15

在Oracle DBMS中,从另一个PL/SQL存储过程中调用Java存储过程还是从另一个PL/SQL存储过程中调用PL/SQL存储过程获得更好的性能,这个取决于具体情况。

顺便说一下,如果我的PL/SQL存储过程中有一个循环,会多次调用Java存储过程(即我的代码在PL/SQL和Java存储过程之间切换),那么这会降低性能吗?


4
我假设从PL/SQL调用Java每次都需要进行上下文切换,所以我猜这会运行得比较慢。也许可以完全消除循环,但是如果没有看到你的代码,无法确定。 - Frank Schmitt
谢谢Frank,实际上我已经计算了调用相同数量的循环周期(600个循环周期)等效PL/SQL过程所需的毫秒数,并且结果是几乎没有差别,除了它提前了约100毫秒完成。 - Khalid Galal
1
我同意Frank的观点,每次调用Java存储过程(PL/SQL -> Java和再返回)都必然会有两个上下文切换。如果被调用的过程是纯PL/SQL(即没有SQL访问),那么PL/SQL选项将更快(尝试在10000次迭代而不是600次迭代中运行)。此外,PL/SQL被调用的过程是否可以定义为DETERMINISTIC?如果可以的话,如果您的循环中重复使用任何参数,则可能会节省一些时间。另外,您正在运行哪个版本的Oracle?如果是11g,则内联功能应该使PL/SQL到PL/SQL的调用非常快。 - Ollie
2
你能详细解释一下你想要实现什么吗?如果由我来选择,我会坚持使用一种技术(pl/sql)。如果出现问题,你不必弄清楚哪一方面导致了问题。我见过很多应用程序只是因为有人想要使用/学习它而使用某些技术,结果导致更多的维护工作。 - Jeff Moore
1个回答

13

任何从一种语言切换到另一种语言都会涉及额外的开销(即使可能很小,但仍然存在)。如果它在一个循环中,这种开销会更加明显。

保持简单,如果可以就坚持使用PL/SQL。

Tom Kyte(Oracle公司副总裁和大师)有一个口头禅,似乎在这里重复一下比较合适:

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

  • 如果可能的话,应该在单个SQL语句中完成它。
  • 如果无法在单个SQL语句中完成,则应使用PL/SQL完成。
  • 如果无法在PL/SQL中完成,请尝试使用Java存储过程。
  • 如果无法在Java中完成,请使用C外部程序完成。
  • 如果无法在C外部程序中完成,则您可能需要认真考虑为什么需要这样做...

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接