Oracle中的性能独立过程和程序包过程

时间:2009-11-28 09:08:32

标签: oracle stored-procedures

独立程序和打包程序之间的性能差异是什么?这将是明智的表现,为什么?两者的执行是否有任何区别?

5 个答案:

答案 0 :(得分:9)

Tom says

  

始终使用包裹   切勿使用独立程序   除了演示,测试和独立   公用事业(什么都不叫,是   什么都不叫“

在那里你也可以找到关于他们表现的非常好的讨论。只需在该页面上搜索“性能” 如果仍然有严重的疑问,你可以随时测试自己哪一个更快。你肯定会通过这样做来学习新东西。

我对你的问题的看法:虽然在某些情况下调用包程序/函数似乎比调用独立程序/函数更慢,但使用软件包时可用的附加功能所带来的优势远远超过性能损失。所以,就像汤姆所说,使用包。


链接:http://asktom.oracle.com/pls/asktom/f?p=100:11:0::::P11_QUESTION_ID:7452431376537


测试代码(2000万次调用,runstats_pkg是我根据runstats package by Tom Kyte编写的包):

CREATE OR REPLACE PACKAGE testperf AS
   FUNCTION pow(i INT) RETURN INT;
END;
/

CREATE OR REPLACE PACKAGE BODY testperf AS
   FUNCTION pow(i int) RETURN INT AS
   BEGIN
      RETURN i * i;
   END;
END;
/

CREATE OR REPLACE FUNCTION powperf(i INT) RETURN INT AS
BEGIN
   RETURN i * i;
END;
/

DECLARE
   I INT;
   S INT DEFAULT 0;
BEGIN
   runstats_pkg.start1;
   FOR I IN 1 .. 20000000 LOOP
      s := s + (powperf(i) / i);
   END LOOP;
   runstats_pkg.stop1;

   dbms_output.put_line(s);
   s := 0;

   runstats_pkg.start2;
   FOR I IN 1 .. 20000000 LOOP
      s := s + (testperf.pow(i) / i);
   END LOOP;
   runstats_pkg.stop2;

   dbms_output.put_line(s);

   runstats_pkg.show;
END;

结果(Oracle XE):

Run1 latches total versus runs -- difference and pct
        Run1        Run2        Diff       Pct
       2,491       2,439         -52    102.13%

Run1 ran in 2304 hsecs
Run2 ran in 2364 hsecs
run 1 ran in 97.46% of the time

结果(Oracle 11g R1,不同的计算机):

Run1 latches total versus runs -- difference and pct
        Run1        Run2        Diff       Pct
       2,990       3,056          66     97.84%

Run1 ran in 2071 hsecs
Run2 ran in 2069 hsecs
run 1 ran in 100.1% of the time

所以,你去吧。真的没什么区别。 想要更复杂的数据,还需要SQL DML吗?你必须亲自测试一下。

答案 1 :(得分:5)

除了包可以具有状态和独立的过程和功能之外,没有性能差异。

包的使用更多地是关于代码的依赖性和分组。您可以将它们视为命名空间的替代方案。

答案 2 :(得分:3)

使用包的主要原因是它们打破了依赖链。例如,如果你有两个独立的程序,程序A调用程序B并重新编译程序B,你还需要重新编译程序A.当你增加程序和函数的数量时,这会非常复杂。

如果将它们移动到两个不同的包,只要规范没有改变,就不需要重新编译它们。

答案 3 :(得分:2)

两者之间应该没有区别。

包的主要用途是对一组类似/相关的函数+过程进行分组

答案 4 :(得分:0)

这里的其他答案都很好(例如,包具有状态,它们将接口与实现分开等)。

另一个区别是当包装过程或包时 - 打开过程很简单,但不打包包体。