2009-05-18 18 views
1

Gibt es Unterschiede in der Leistung, wenn Sie eine gespeicherte Prozedur in mehrere Prozeduren zerlegen, anstatt eine große Prozedur zu verwenden?
Welcher ist schneller?
Oracle/PLSQL-Leistung

Zum Beispiel:

mainSP 
    callSP1 
    callSP2 
    callSP3 
end; 

statt:

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

Antwort

6

Jeder Leistungsvorteil wäre in sehr seltenen Fällen, z.B. wobei der Hauptproc viele Male in einer Schleife aufgerufen wird und jede einzelne Iteration nicht viel Zeit benötigt.

Meistens überwiegt die Wartbarkeit, wenn Ihr Programm in logische Schritte zerlegt wird, den geringfügigen Leistungsgewinn, den Sie haben könnten, bei weitem.

Wie bereits erwähnt, Benchmark und Test - es sei denn, Sie sehen einen signifikanten Vorteil, für die Wartbarkeit gehen - zukünftige Entwickler werden es Ihnen danken!

0

es hängt davon ab, was geschieht.

Wenn mainSP über callSP1 läuft und mainSP nur einzelne Anweisungen ausführen könnte, um an einer Datenmenge zu arbeiten, wäre es langsamer.

Es gibt einen kleinen Overhead beim Aufruf anderer Prozeduren, und auch ein wenig Schmerz beim Zurückgeben von Fehlermeldungen.

Wenn Sie Code vollständig duplizieren, erstellen Sie eine allgemeine Routine. ansonsten halte es zusammen.

2

In der Theorie gibt es einen leichten Leistungseinbruch jedes Mal, wenn eine gespeicherte Prozedur von einer anderen gespeicherten Prozedur aufgerufen wird. Die genaue Auswirkung hängt jedoch von der Anzahl der Parameter und dem Typ der aufgerufenen gespeicherten Prozedur ab.

Im Allgemeinen sollte es egal sein. Aber im Zweifel Test.

+0

Ich bemerkte, dass Sie etwas über die Anzahl der Parameter sagten. Gibt es Leistungsprobleme mit 3 oder 4 Cursorn? – jDeveloper

6

In 10g und darüber gibt es einen "optimierenden Compiler".

In 11g, wird es tun „Unterprogramm inlining. Subprogram inlining ersetzt einen Unterprogrammaufruf (zu einem Unterprogramm in der gleichen Programmeinheit) mit einer Kopie des aufgerufenen Unterprogrammes“

Ich dachte, die inlining Teil von 10 g war , kann sie dort aber nicht finden.

+1

Inlining wurde definitiv in 11g hinzugefügt. Frühere Versionen von Oracle (8i, vielleicht 9i) hatten einen erheblichen Funktionsaufwand, was uns dazu führte, dass wir den Code in Fällen, in denen die Leistung DRY-Prinzipien erfüllte, selbst "inline" einführten. –