2009-05-18 29 views
1

ストアドプロシージャを大きなプロシージャではなく複数のプロシージャに分割すると、パフォーマンスに違いはありますか?
どちらが高速ですか?
例えばOracle/PLSQLのパフォーマンス

mainSP 
    callSP1 
    callSP2 
    callSP3 
end; 

いうより:

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

答えて

6

パフォーマンス上のメリットは非常にまれです。メインプロシージャはループ内で何度も何度も呼び出されており、個々の繰り返しはあまり時間がかかりません。

ほとんどの場合、プログラムを論理的なステップに分割することの保守性は、実現可能性のあるマイナーなパフォーマンスの向上を上回ります。

前述のように、ベンチマークとテストでは、重要な利点がない限り、保守性が求められます。将来の開発者に感謝します!

0

それは何が起こっているかに依存します。

mainSPがcallSP1でループしていて、mainSPが一連のデータを処理するために単一の文を実行できるだけであれば、速度は遅くなります。

他のプロシージャを呼び出す際に少しオーバーヘッドがあり、エラーメッセージを返す際に少し苦労します。

コードをすべて複製する場合は、共通ルーチンを作成します。他の賢明なそれを一緒に保つ。

2

理論的には、ストアドプロシージャが別のストアドプロシージャから呼び出されるたびにわずかなパフォーマンスが発生します。ただし、正確な影響は、呼び出されるストアドプロシージャのパラメータとタイプの数によって異なります。

一般に問題ではありません。しかし、疑わしい時にテストします。

+0

あなたはパラメータの数について何か言ったことに気付きました。 3つまたは4つのカーソルを持つことでパフォーマンス上の問題はありますか? – jDeveloper

6

10g以上には、「最適化コンパイラ」があります。 11g

、それはやるだろう「サブプログラムのインライン化を。サブプログラムのインライン化と呼ばれるサブプログラムのコピー(同じプログラム・ユニット内のサブプログラムに対する)サブプログラム呼び出しを置き換える」

私は、インライン化は、10gの一部だと思いましたしかし、そこにそれが書かれているのを見つけることはできません。

+1

インライン処理は11gで確実に追加されました。以前のバージョンのOracle(8i、多分9i)には機能上のオーバーヘッドがあり、パフォーマンスがDRYの原則を破棄した場合にコードを「インライン化」するケースがありました。 –

関連する問題