Накладные расходы на вызов процедуры / функции в другом пакете Oracle

StackOverflow https://stackoverflow.com/questions/1701580

  •  19-09-2019
  •  | 
  •  

Вопрос

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

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

Мысли / переживания?

Это было полезно?

Решение

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

Другие советы

Те, кто беспокоится, вполне вольны доказать обоснованность своих опасений, продемонстрировав накладные расходы на производительность.это должно быть тривиально.

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

Общий код поставляется в одном пакете.

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

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

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

Oracle использует статус пакета, чтобы указать, является ли пакет ДЕЙСТВИТЕЛЬНЫМ или НЕДЕЙСТВИТЕЛЬНЫМ.Если пакет становится недействительным, то все остальные пакеты которые зависят от него, тоже становятся недействительными.Например, если ваша программа вызывает процедуру в пакете A, которая вызывает процедуру в пакете B, это означает, что вы программируете зависит от пакета A, а пакет A зависит от пакета B.В Oracle это отношение является транзитивным, и это означает, что ваша программа зависит от пакета B.Следовательно, если пакет B поврежден, ваша программа также тормозит (завершается с ошибкой).

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

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

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

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

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

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

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

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top