ストアドプロシージャを大きなプロシージャではなく複数のプロシージャに分割すると、パフォーマンスに違いはありますか?
どちらが高速ですか?
例えばOracle/PLSQLのパフォーマンス
:
mainSP
callSP1
callSP2
callSP3
end;
いうより:
SP
....
....
....
ストアドプロシージャを大きなプロシージャではなく複数のプロシージャに分割すると、パフォーマンスに違いはありますか?
どちらが高速ですか?
例えばOracle/PLSQLのパフォーマンス
:
mainSP
callSP1
callSP2
callSP3
end;
いうより:
SP
....
....
....
パフォーマンス上のメリットは非常にまれです。メインプロシージャはループ内で何度も何度も呼び出されており、個々の繰り返しはあまり時間がかかりません。
ほとんどの場合、プログラムを論理的なステップに分割することの保守性は、実現可能性のあるマイナーなパフォーマンスの向上を上回ります。
前述のように、ベンチマークとテストでは、重要な利点がない限り、保守性が求められます。将来の開発者に感謝します!
それは何が起こっているかに依存します。
mainSPがcallSP1でループしていて、mainSPが一連のデータを処理するために単一の文を実行できるだけであれば、速度は遅くなります。
他のプロシージャを呼び出す際に少しオーバーヘッドがあり、エラーメッセージを返す際に少し苦労します。
コードをすべて複製する場合は、共通ルーチンを作成します。他の賢明なそれを一緒に保つ。
理論的には、ストアドプロシージャが別のストアドプロシージャから呼び出されるたびにわずかなパフォーマンスが発生します。ただし、正確な影響は、呼び出されるストアドプロシージャのパラメータとタイプの数によって異なります。
一般に問題ではありません。しかし、疑わしい時にテストします。
10g以上には、「最適化コンパイラ」があります。 11gで
、それはやるだろう「サブプログラムのインライン化を。サブプログラムのインライン化と呼ばれるサブプログラムのコピー(同じプログラム・ユニット内のサブプログラムに対する)サブプログラム呼び出しを置き換える」
私は、インライン化は、10gの一部だと思いましたしかし、そこにそれが書かれているのを見つけることはできません。
インライン処理は11gで確実に追加されました。以前のバージョンのOracle(8i、多分9i)には機能上のオーバーヘッドがあり、パフォーマンスがDRYの原則を破棄した場合にコードを「インライン化」するケースがありました。 –
あなたはパラメータの数について何か言ったことに気付きました。 3つまたは4つのカーソルを持つことでパフォーマンス上の問題はありますか? – jDeveloper