Каковы преимущества пакетов по сравнению с автономными процедурами и функциями?

13

Ищите канонический ответ на вопрос о том, почему пакеты должны быть предпочтительнее в базе данных Oracle, чем автономные процедуры и функции.

Ли Риффель
источник

Ответы:

12

Преимущества пакетов

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

Безопасные приватные методы - функции и процедуры могут быть сделаны приватными для пакета и использоваться только внутри него. Это делает общественную поверхность более простой и безопасной.

Управление привилегиями - разрешения могут предоставляться один раз для группы процедур, которые работают вместе, а не отдельно для каждой требуемой процедуры / функции.

Безопасная упаковка - упакованные пакеты сложнее развернуть, чем упакованные функции / процедуры.

Упрощенное именование - большее пространство имен позволяет использовать более простые имена, которые можно повторно использовать в других пакетах.

Лучшая производительность - пакеты могут быть скомпилированы и загружены в память целиком, а не по частям, как другие методы. Эта выгода, если она вообще существует, минимальна по сравнению с другими выгодами.

Сокращенная недействительность - изменение тела пакета не делает недействительными зависимости, как изменение функции или процедуры.

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

Ссылки:
11.2 Руководство по концепциям
Задайте вопрос Тому
StackOverflow.com Вопрос о производительности пакета
Развертывание презентации PL / SQL (pdf)

Ли Риффель
источник
2
Я должен не согласиться с преимуществом производительности. Если загрузка кода в память является заметным событием ожидания, произошло нечто очень плохое. И есть большая вероятность, что тот факт, что пакеты снизят производительность, потому что вам нужно читать больше кода, когда вы загружаете весь пакет, когда вам действительно нужен только один метод. В любом случае, разница в производительности не будет измеримой.
Джастин Кейв
@Justin - этот момент взят из Руководства по 11.2. Вот что он говорит: «Лучшая производительность - весь пакет загружается в память небольшими порциями, когда процедура в пакете вызывается впервые. Эта загрузка выполняется за одну операцию, в отличие от отдельных нагрузок, необходимых для автономной работы. процедуры. Когда происходят обращения к связанным пакетным процедурам, не требуется дисковый ввод-вывод для запуска скомпилированного кода в памяти ".
Ли Риффель
4
Я согласен с тем, что в документации утверждается, что есть выигрыш в производительности. Документация неверна или, как минимум, недостаточна. В лучшем случае величина «пользы» ничтожна. И признак пользы неизвестен. Так же, как сканирование таблицы более эффективно, если вы читаете большую часть строк, а доступ к индексу более эффективен, если вы читаете одну строку, чтение всего пакета в память за один раз выгодно, если вы собираетесь используйте каждый метод и невыгодно, если вы действительно хотели только один метод.
Джастин Кейв
1
@Justin - Ваша оценка звучит логично. Так или иначе, я не нашел ничего определенного, поэтому я добавил оговорку к сути ответа. Спасибо за ваш вклад.
Ли Риффель
Я думаю, что это преимущество в производительности похоже на кэширование. Если вы используете только эту процедуру и используете ее реже, вы не получите никакого выигрыша в производительности. Но если вы используете его часто, и в этом пакете используется любая другая процедура, вы получаете преимущества. Разработчик использует кэширование, поскольку улучшается не реальная, а воспринимаемая производительность. Поскольку связанные процедуры помещаются в один и тот же пакет, логично, что будут вызваны и некоторые другие процедуры. Это все о вероятности вызова двух процедур в одном пакете. И, как правило, читать с большой вероятностью, это происходит.
Атилла Озгур