Добро пожаловать в форум, Guest  >>   Войти | Регистрация | Поиск | Правила | В избранное | Подписаться
Все форумы / Oracle Новый топик    Ответить
 Package vs Procedure  [new]
denger
Member

Откуда:
Сообщений: 303
Привет участникам форума!
Подскажите,плиз, целесообразно ли объединять в пакет процедуры и функции, есть ли выигрыш по скорости выполнения этих процедур и ф-й в составе пакета?
У нас есть процедура, как точка входа в расчетную часть, а в ней куча процедур и функций, которые выполняюся последовательно..
Буду благодарен любым конструктивным мыслям,
спасибо.
-----
as is
19 май 08, 14:25    [5683219]     Ответить | Цитировать Сообщить модератору
 Re: Package vs Procedure  [new]
stax..
Guest
если спецификации меняються редко или очень редко то имхо есть
зы
встречал мнение что в идеале чистых ф-ций/процедур не должно быть
...
stax
19 май 08, 14:31    [5683280]     Ответить | Цитировать Сообщить модератору
 Re: Package vs Procedure  [new]
tru55
Member

Откуда: СПб
Сообщений: 19790
PL/SQL User’s Guide and Reference

Advantages of PL/SQL Packages
19 май 08, 14:32    [5683290]     Ответить | Цитировать Сообщить модератору
 Re: Package vs Procedure  [new]
denger
Member

Откуда:
Сообщений: 303
2 tru55,stax..
Всем спасибо.
Вот нашел, то что нужно.

Better Performance
When you call a packaged subprogram for the first time, the whole package is loaded
into memory. Later calls to related subprograms in the package require no disk I/O.

-----
as is
19 май 08, 14:55    [5683510]     Ответить | Цитировать Сообщить модератору
 Re: Package vs Procedure  [new]
Nikolay Shevchenko
Member

Откуда:
Сообщений: 1
Кроме всего этого, общеизвестно что пакеты занимают намного меньше места в системном словаре, поэтому очевидно что по хорошему надо стремиться представлять весь код в БД только в пакетах.
19 май 08, 16:31    [5684428]     Ответить | Цитировать Сообщить модератору
 Re: Package vs Procedure  [new]
Elic
Member

Откуда:
Сообщений: 29988
Nikolay Shevchenko
общеизвестно что пакеты занимают намного меньше места в системном словаре
19 май 08, 16:36    [5684476]     Ответить | Цитировать Сообщить модератору
 Re: Package vs Procedure  [new]
Да ну ?
Guest
Nikolay Shevchenko
Кроме всего этого, общеизвестно что пакеты занимают намного меньше места в системном словаре


Покажешь ?
19 май 08, 17:07    [5684782]     Ответить | Цитировать Сообщить модератору
 Re: Package vs Procedure  [new]
Эталон Этанолович
Member

Откуда: Институт благородных девиц. Палата №6
Сообщений: 332
denger

Вот нашел, то что нужно.

Better Performance
When you call a packaged subprogram for the first time, the whole package is loaded
into memory.
А теперь подумай, и поймешь, что этот же плюс может быть и минусом ;-)
19 май 08, 17:20    [5684863]     Ответить | Цитировать Сообщить модератору
 Re: Package vs Procedure  [new]
Я и ёжик
Member

Откуда: СПб
Сообщений: 1815
Да ну ?
Nikolay Shevchenko
Кроме всего этого, общеизвестно что пакеты занимают намного меньше места в системном словаре


Покажешь ?


SQL> select type, sum(source_size) source,  sum(parsed_size) DIANA, sum(code_size) BYTE_CODE
2 from user_object_size d
3 where type in ('PACKAGE','PACKAGE BODY','PROCEDURE','FUNCTION')
4 group by type;

TYPE SOURCE DIANA BYTE_CODE
------------- ---------- ---------- ----------
PROCEDURE 14580 2056 8897
PACKAGE 981228 443048 139409
PACKAGE BODY 5015945 0 1669886
FUNCTION 39342 4590 15919

Andrei Kiselev
--
The views expressed are my own and not necessarily those of my hedgehog
19 май 08, 17:35    [5684989]     Ответить | Цитировать Сообщить модератору
 Re: Package vs Procedure  [new]
Elic
Member

Откуда:
Сообщений: 29988
Я и ёжик
SQL> select type, sum(source_size) source,  sum(parsed_size) DIANA, sum(code_size) BYTE_CODE
2 from user_object_size d
3 where type in ('PACKAGE','PACKAGE BODY','PROCEDURE','FUNCTION')
4 group by type;

TYPE SOURCE DIANA BYTE_CODE
------------- ---------- ---------- ----------
PROCEDURE 14580 2056 8897
PACKAGE 981228 443048 139409
PACKAGE BODY 5015945 0 1669886
FUNCTION 39342 4590 15919
RTFM
PARSED_SIZE NUMBER Size of the parsed form of the object, in bytes. Must be in memory when an object is being compiled that references this object.
19 май 08, 17:58    [5685154]     Ответить | Цитировать Сообщить модератору
 Re: Package vs Procedure  [new]
Серафимный Шестикрыл
Member [заблокирован]

Откуда: С луны свалился
Сообщений: 2922
Elic
RTFM
PARSED_SIZE NUMBER Size of the parsed form of the object, in bytes. Must be in memory when an object is being compiled that references this object.


Это не значит, что DIANA не хранится в словаре. Просто для тела пакета она не сохраняется.
Не нужна - поскольку для спецификации есть.

Просто слово "намного" и "все запихивать в пакеты" - это очень сильное утверждение. ;)
19 май 08, 18:14    [5685275]     Ответить | Цитировать Сообщить модератору
 Re: Package vs Procedure  [new]
denger
Member

Откуда:
Сообщений: 303
Эталон Этанолович
А теперь подумай, и поймешь, что этот же плюс может быть и минусом ;-)


Как это ни странно, но..
Сделал замер времени выполнения расчетов в составе пакета и процедуры с помощью dbms_utility.get_time и результат показал, что использование процедуры в общем случае быстрей, чем пакета. В среднем на 1сек быстрей при использовании процедуры как точки входа в расчетную часть [для 100 запусков].
19 май 08, 18:15    [5685276]     Ответить | Цитировать Сообщить модератору
 Re: Package vs Procedure  [new]
Я и ёжик
Member

Откуда: СПб
Сообщений: 1815
Elic
RTFM
PARSED_SIZE NUMBER Size of the parsed form of the object, in bytes. Must be in memory when an object is being compiled that references this object.

Не понял, честно говоря , что имеешь ввиду. Ну должен он быть в памяти когда компилируются объекты ссылающиеся на наш объект, налицо экономия места в library cache, за счет того, что ссылки только на маленькую спецификацию пакета с "маленьким" DIANA-кодом, а DIANA-код большого и толстого тела пакета благополучно забывается после компиляции за ненадобностью.
Причем если верить Фейернштейну ( вернее, на сколько понимаю, Стиву Адамсу, который участвовал в писании 20-главы "Oracle PL/SQL для профессионалов") хранится DIANA код в более сжатом виде , чем потом развертывается.
19 май 08, 18:17    [5685291]     Ответить | Цитировать Сообщить модератору
 Re: Package vs Procedure  [new]
Elic
Member

Откуда:
Сообщений: 29988
Я и ёжик
Не понял, честно говоря , что имеешь ввиду.
Только то, что не понял, к чему ты акцентировался именно на этой циферке, не обращая внимания на числа справа и слева от неё.
Было бы интересно узнать, как же она, по-твоему, "показывает", что "пакеты занимают намного меньше места в системном словаре" :)
19 май 08, 18:48    [5685447]     Ответить | Цитировать Сообщить модератору
 Re: Package vs Procedure  [new]
SY
Member

Откуда: Middlebury, CT USA
Сообщений: 10051
AFAIK, DIANA provides source code dependency trees. Then DIANA is used to compile dependent (on procedure/function/package) objects. Therefore, DIANA for a procedure/function and DIANA for same procedure/function wrapped in a package should be pretty much same size. Now, DIANA for private procedures/functions, etc. is obviously not needed and therefore DIANA for a package body = 0, so we could gain on DIANA size by reworking complex procedure/function into a package with some private procedures/functions implementing intermediary tasks. However wrapping procedure/function as is into a package will not, IMHO, change DIANA size:

SQL> create or replace
  2  procedure p1
  3  is
  4  begin
  5  null;
  6  end;
  7  /

Procedure created.

SQL> create or replace
  2  package pkg1
  3  is
  4  procedure p1;
  5  end;
  6  /

Package created.

SQL> create or replace
  2  package body pkg1
  3  is
  4  procedure p1
  5  is
  6  begin
  7  null;
  8  end;
  9  end;
 10  /

Package body created.

SQL> select type, sum(source_size) source,  sum(parsed_size) DIANA, sum(code_size) BYTE_CODE
  2  from user_object_size d
  3  where name in ('P1','PKG1')
  4  group by type;

TYPE              SOURCE      DIANA  BYTE_CODE
------------- ---------- ---------- ----------
PROCEDURE             32        165        201
PACKAGE               34        167        177
PACKAGE BODY          58          0        185

SQL> 


SY.
19 май 08, 19:19    [5685591]     Ответить | Цитировать Сообщить модератору
 Re: Package vs Procedure  [new]
Я и ёжик
Member

Откуда: СПб
Сообщений: 1815
Я думал, что DIANA используется не только при отслеживании внешних зависимостей, но и при компиляции кода, для отслеживания зависимостей внутри модуля,
тогда размер DIANA кода должен зависить от сложности структуры модуля.
На такую интерпретацию толкают некоторые фразы в документации:
http://download.oracle.com/docs/cd/B19306_01/appdev.102/b14261/limits.htm#LNPLS018

...
In the shared memory pool, a package spec, object type spec, standalone subprogram, or anonymous block is limited to 67108864 (2**26) DIANA nodes which correspond to tokens such as identifiers, keywords, operators, and so on. This allows for ~6,000,000 lines of code
...
Unfortunately, you cannot estimate the number of DIANA nodes from the parsed size. Two program units with the same parsed size might require 1500 and 2000 DIANA nodes, respectively because, for example, the second unit contains more complex SQL statements.


Но получается , что даже если он и строится во время компиляции для всего модуля, то сохраняется только часть позволяющая отслеживать зависимости на модуль, его интерфейс.

Хотя некоторая информация хранимая для отдельных процедур и функций, не хранится для тела пакета, например наличие обращения к базе данных (добавление любого запроса увкеличивает parsed size, последующие запросы уже не увеличивают), наличие обращение к хранимому коду в другой схеме ( опять же именно наличие, добавление вызовов из еще одной схемы ничего дальше не меняет), возможно еще что-то.

SQL> 
SQL> create or replace procedure p1 is
  2      par1 int; 
  3      procedure p22 is
  4      begin
  5            select 1 into par1 from dual; 
  6            sys.dbms_lock.sleep(10);  
  7      end;
  8  begin p22;  end;
  9  /

Процедура создана.

create or replace  procedure p2  is
  2      par1 int; 
  3      procedure p22  is
  4      begin
  5            select 1 into par1 from dual; 
  6            sys.dbms_lock.sleep(10);  
  7      end;
  8  begin p22; end;
  9  /

Процедура создана.


SQL> create or replace package pkg1  is
  2    procedure p2;  
  3    procedure p1;
  4  end;
  5  /

Пакет создан.

SQL> create or replace package body pkg1  is
  2    procedure p2 is 
  3      par1 int; 
  4      procedure p22 is
  5      begin
  6            select 1 into par1 from dual; 
  7            sys.dbms_lock.sleep(10);  
  8      end;
  9    begin  p22;  end;  
 10    procedure p1 is
 11      par1 int; 
 12      procedure p22 is
 13      begin
 14            select 1 into par1 from dual;
 15            sys.dbms_lock.sleep(10);
 16      end;
 17    begin p22;  end;
 18  end;
 19  /

Тело пакета создано.

SQL>  select type, sum(source_size) source,  sum(parsed_size) DIANA, sum(code_size) BYTE_CODE
  2    from user_object_size d
  3    where name in ('P1','P2','PKG1')
  4    group by type;

TYPE              SOURCE      DIANA  BYTE_CODE
------------- ---------- ---------- ----------
PROCEDURE            323        902       1254
PACKAGE BODY         359          0        947
PACKAGE               53        220        304


Andrei Kiselev
--
The views expressed are my own and not necessarily those of my hedgehog
21 май 08, 10:49    [5692733]     Ответить | Цитировать Сообщить модератору
Все форумы / Oracle Ответить