Производительность Oracle/PLSQL

Есть ли разница в производительности, когда вы разбиваете хранимую процедуру на несколько процедур вместо большой процедуры?
Какой из них быстрее?

Например:

mainSP
  callSP1
  callSP2
  callSP3
end;

скорее, чем:

SP
  .... 
  ....
  ....  

person jDeveloper    schedule 18.05.2009    source источник


Ответы (4)


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

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

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

person Jeffrey Kemp    schedule 20.05.2009

В 10g и выше есть «оптимизирующий компилятор».

В 11g выполняется "встраивание подпрограмм . Встраивание подпрограммы заменяет вызов подпрограммы (подпрограммы в том же программном модуле) копией вызываемой подпрограммы"

Я думал, что встраивание было частью 10g, но не могу найти его там документально.

person Gary Myers    schedule 18.05.2009
comment
Встраивание определенно было добавлено в 11g. Более ранние версии Oracle (8i, может быть, 9i) имели значительные функциональные накладные расходы, что заставляло нас в некоторых случаях самостоятельно встраивать код в тех случаях, когда производительность превосходила принципы DRY. - person Chris R. Donnelly; 12.08.2009

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

В целом это не должно иметь значения. Но когда есть сомнения, проверьте.

person Jeff    schedule 18.05.2009
comment
Я заметил, что вы сказали что-то о количестве параметров. Есть ли проблемы с производительностью при наличии 3 или 4 курсоров. - person jDeveloper; 19.05.2009

это зависит от того, что происходит.

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

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

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

person KM.    schedule 18.05.2009