Автономная процедура производительности по сравнению с пакетной процедурой в Oracle - PullRequest
2 голосов
/ 28 ноября 2009

Какая разница в производительности между автономной процедурой и упакованной процедурой? Какая будет хорошая производительность и почему? Есть ли разница в исполнении обоих?

Ответы [ 5 ]

9 голосов
/ 28 ноября 2009

Том говорит :

Всегда используйте пакет.
Никогда не используйте автономную процедуру за исключением демонстраций, тестов и автономных утилиты (которые ничего не называют и являются ничем не называется)

Там вы также можете найти очень хорошее обсуждение их производительности. Просто найдите «производительность» на этой странице.
Если вы все еще серьезно сомневаетесь, вы всегда можете проверить себя, какой из них быстрее. Делая это, вы непременно узнаете что-то новое.

Я согласен с вашим вопросом: хотя правда, что вызов процедур / функций пакета в некоторых ситуациях кажется медленнее, чем вызов отдельных процедур / функций, преимущества, предоставляемые дополнительными функциями, доступными при использовании пакетов, значительно перевешивают потерю производительности. Итак, как сказал Том, используйте пакеты.


Ссылка: http://asktom.oracle.com/pls/asktom/f?p=100:11:0::::P11_QUESTION_ID:7452431376537


Тестовый код (20 миллионов вызовов, runstats_pkg - это пакет, который я написал на основе пакета runstats Тома Кайта ):

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? Ты должен проверить это сам.

5 голосов
/ 28 ноября 2009

Разницы в производительности нет, за исключением того, что пакеты могут иметь состояние и автономные процедуры и функции.

Использование пакета - это больше упорядочение и группировка кода. Вы могли бы видеть их как альтернативу пространств имен.

3 голосов
/ 28 ноября 2009

Основной причиной использования пакетов является разрыв цепочки зависимостей. Например, если у вас есть две автономные процедуры, процедура A, которая вызывает процедуру B, и вы перекомпилируете процедуру B, вам также потребуется перекомпилировать процедуру A. Это становится довольно сложным по мере увеличения количества процедур и функций.

Если вы перенесете их в два разных пакета, вам не нужно будет перекомпилировать их, пока спецификация не изменится.

2 голосов
/ 28 ноября 2009

Между ними не должно быть различий.

Основное использование пакетов - группирование набора похожих / связанных функций + процедуры

0 голосов
/ 29 ноября 2009

Все остальные ответы здесь хороши (например, пакеты имеют состояние, они отделяют интерфейс от реализации и т. Д.).

Другое различие заключается в том, что процедуры или пакеты упакованы - просто развернуть процедуру, но не тело пакета.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...