2010-12-02 9 views
1

Ich habe eine gespeicherte Prozedur, die über eine Minute dauert zu laufen. Wenn ich den Code innerhalb der gespeicherten Prozedur nehme und diesen direkt ausführe, dauert es ungefähr 20 Sekunden. Ich kann mir nichts vorstellen, was dazu führen würde ...Warum ist das Aufrufen einer gespeicherten Prozedur langsamer als das Ausführen des Codes in der gespeicherten Prozedur?

Wenn ich mir die Ausführungspläne anschaue, sind sie unterschiedlich, aber wenn ich den Ausführungsplan auf die Abfrage selbst bringe, erhöht sich die Zeit auf dem Niveau des Aufrufs der gespeicherten Prozedur .

Ich habe versucht, eine neue sproc mit dieser Abfrage zu schaffen, aber es war genauso langsam wie die alten ...

+0

Geben Sie den Code ein. Ohne das können wir nur raten. – GilaMonster

Antwort

3

Ich stehle total dies Grant Fritchey, aber zumindest ihm als Verdienst angerechnet ich gebe:

Parameter Sniffing ist in der Regel die Ursache für so etwas. Wenn Sie die Abfrage nur als Abfrage ausführen, sind alle Parameter lokal, sodass SQL Server sie betrachten, sie aufspüren und basierend auf den Werten einen Ausführungsplan ermitteln kann. Sobald Sie Parameter in eine gespeicherte Prozedur eingeben, nimmt SQL Server einen unbekannten Wert im Parameter korrekt an und erstellt einen anderen Ausführungsplan. In den meisten Fällen funktioniert das gut. In einigen Fällen nicht.

+0

Kann ich irgendetwas dagegen tun? – CodeRedick

+0

Siehe Gail Shaw's kurzer Artikel hier: http://sqlinthewild.co.za/index.php/2007/11/27/parameter-sniffing/ –

+0

Übrigens, ich fragte die gleiche Frage auf einer anderen Tech-Q & A-Site, so dass ich damit vertraut war (Und das ist der Punkt, von dem das obige Zitat stammt.) Eine grundlegende Antwort ist die Verwendung lokaler Variablen. –

0

Ist es möglich, dass die Daten, da die gespeicherte Prozedur viel verändert/gewachsen erstellt wurde? Es sei daran erinnert, dass ein Punkt einer gespeicherten Prozedur darin besteht, einen Ausführungsplan zwischenzuspeichern, so dass der nächste Lauf dies nicht tun musste. Wenn sich die Daten im Laufe der Zeit drastisch ändern, funktioniert der Sproc möglicherweise nicht so gut.

SQL Um zu erzwingen, einen neuen Ausführungsplan für eine sproc zu bauen und mehr here

+0

Ich habe versucht, einen neuen Sproc zu erstellen, nur um das zu testen, und es gab keinen Unterschied. Der neue Sproc war genauso langsam wie der alte ... :( – CodeRedick

1

gehen lernen Klingt wie Sie haben tatsächlichen Ausführungsplan einschließen "aktiviert, wenn Sie die gespeicherte Prozedur ausführen. Wenn ja, versuchen Sie es mit dieser Option ausgeschaltet.

+0

Nein, das hatte ich nur, als ich tatsächlich versuchte, den Ausführungsplan zu sehen. – CodeRedick

Verwandte Themen