Затраты на вызов процедуры / функции в другом пакете Oracle - PullRequest
3 голосов
/ 09 ноября 2009

Мы обсуждаем влияние на производительность помещения общей функции / процедуры в отдельный пакет или использования локальной копии в каждом пакете.

Я думаю, что было бы чище иметь общий код в пакете, но другие беспокоятся о снижении производительности.

Мысли / опыт? * * 1005

Ответы [ 3 ]

7 голосов
/ 09 ноября 2009

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

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

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

Между тем им следует учитывать использование памяти и затраты на обслуживание при повторении кода в нескольких местах.

Общий код идет в одной упаковке.

1 голос
/ 10 ноября 2009

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

Есть некоторые проблемы с производительностью, а также проблемы с памятью, но они встречаются редко и далеко друг от друга. Кроме того, они попадают в категорию «Оракул черной магии». Например, проверьте эту ссылку . Если вы четко понимаете, о чем идет речь, считайте себя опытным профессионалом Oracle. Если нет - не волнуйтесь, потому что это действительно хардкорные вещи.

Однако вам следует рассмотреть вопрос о зависимостях. Пакет Oracle состоит из 2 частей: spec и body : Spec - заголовок, в котором объявлены публичные процедуры и функции (то есть видимые вне пакета). Тело является их реализацией. Хотя они тесно связаны, они представляют собой 2 отдельных объектов базы данных.

Oracle использует статус пакета, чтобы указать, является ли пакет VALID или INVALID. Если пакет становится недействительным, то все остальные пакеты которые зависят от этого, становятся также недействительными. Например, если ваша программа вызывает процедуру в пакете A, которая вызывает процедуру в пакете B, это означает, что вы программируете зависит от пакета A, а пакет A зависит от пакета B. В Oracle это отношение является переходным, и это означает, что ваша программа зависит от пакета B. Следовательно, если пакет B сломан, ваша программа также тормозит (завершается с ошибкой).

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

Предположим, что спецификации и тела для вашего пакета A и пакета B успешно скомпилированы и действительны. Затем вы идете и вносите изменения в тело пакета пакета B. Поскольку вы изменили только тело, но не спецификацию, Oracle предполагает, что способ вызова пакета B не изменился и ничего не делает.

Но если вместе с телом вы измените спецификацию пакета B, то Oracle подозревает, что вы могли изменить некоторые параметры процедуры или что-то в этом роде и помечает всю цепочку как недействительные (то есть, пакеты B и A и ваша программа) Обратите внимание, что Oracle не проверяет, действительно ли спецификация была изменена, она просто проверяет временную метку. Итак, достаточно просто перекомпилировать спецификацию, чтобы сделать все недействительным.

Если аннулирование произойдет, при следующем запуске программы произойдет сбой. Но если вы запустите его еще раз, Oracle автоматически все перекомпилирует и успешно выполнит.

Я знаю, что это сбивает с толку. Это Оракул. Не пытайтесь обернуть свои мозги слишком много вокруг этого. Вам нужно запомнить только пару вещей:

  • По возможности избегайте сложных межпакетных зависимостей. Если одна вещь зависит от другой вещи, которая зависит от еще одной вещи и так далее, тогда вероятность аннулирования всего, перекомпилировав только один объект базы данных, чрезвычайно высока. Один из худших случаев - это циклические зависимости, когда пакет A вызывает процедуру в пакете B, а пакет B вызывает процедуру в пакете A. В этом случае практически невозможно скомпилировать одно без торможения другого.

  • Храните спецификацию пакета и тело пакета в отдельных исходных файлах. И если вам нужно только изменить тело, не трогайте спецификацию!

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