Warum gibt es Leistungsunterschiede, wenn eine SQL-Funktion von einer .Net-Anwendung aufgerufen wird, oder wenn derselbe Aufruf in Management Studio ausgeführt wird

8

Wir haben ein Problem in unseren Test- und Entwicklungsumgebungen mit einer Funktion, die ziemlich langsam läuft, wenn sie von einer .Net-Anwendung aufgerufen wird. Wenn wir diese Funktion direkt von Management Studio aufrufen, funktioniert es gut.

Hier sind die Unterschiede, wenn sie profiliert sind: Aus der Anwendung:
CPU: 906
Liest: 61853
Schreibt: 0
Dauer: 926

Von SSMS:
CPU: 15
Liest: 11243
Schreibt: 0
Dauer: 31

Nun haben wir festgestellt, dass die Leistung bei der Neukompilierung der Funktion wieder zu dem kommt, was wir erwarten, und das Leistungsprofil bei der Ausführung von der Anwendung dem entspricht, was wir bei der Ausführung von SSMS erhalten. Es beginnt wieder zu verlangsamen, was in zufälligen Intervallen erscheint.

Wir haben das nicht in prod gesehen, aber sie können teilweise darin bestehen, dass alles dort wöchentlich neu kompiliert wird.

Was könnte diese Art von Verhalten verursachen?

Bearbeiten -
Wir waren endlich in der Lage, dies anzugehen, und die Umstrukturierung der Variablen, um mit Parameter-Sniffing umzugehen, scheint den Trick geschafft zu haben ... ein Ausschnitt dessen, was wir hier gemacht haben: Danke für Ihre Hilfe.

%Vor%     
Dan Snell 07.05.2010, 00:05
quelle

3 Antworten

4

Dies liegt normalerweise daran, dass Sie in Ihrer SSMS-Verbindung einen anderen Ausführungsplan erhalten. Häufig im Zusammenhang mit Parameter-Sniffing-Problemen, bei denen der Plan mit einem bestimmten Wert generiert wird, der für andere Werte der Parameter suboptimal ist. Dies erklärt auch, warum eine Neukompilierung das Problem beheben würde. Dieser Thread scheint eine gute Erklärung Parameter Sniffing (oder Spoofing) in SQL Server

    
Martin Smith 07.05.2010, 00:08
quelle
5

Ich hatte ein ähnliches Problem mit gespeicherten Prozeduren, und für mich stellte sich heraus, dass es "Parameter-Sniffing" war. Google das und sehen, ob es Ihr Problem löst, für mich war es dramatische Beschleunigung, sobald ich es behoben habe.

In meinem Fall habe ich es behoben, indem ich eine lokale Variable für jeden übergebenen Parameter deklariert und dann die lokale Variable diesem Parameterwert zugewiesen habe, und der Rest des Procs hat die lokalen Variablen für die Verarbeitung ... für verwendet Aus irgendeinem Grund hat dies den Parameter Sniffing besiegt.

    
E.J. Brennan 07.05.2010 00:09
quelle
4

Eine wahrscheinliche Ursache sind veraltete Statistiken und / oder Parameter-Sniffing, die dazu führen, dass ein zwischengespeicherter Abfrageplan wiederverwendet wird, der nicht optimal ist.

SSMS gibt Pre-Amble-Anweisungen aus, die Sie nicht sehen. Dies führt dazu, dass die übermittelte Abfrage jedes Mal neu kompiliert wird, wodurch die Möglichkeit der Verwendung eines falschen zwischengespeicherten Plans ausgeschlossen wird.

Dadurch werden alle Statistiken aktualisiert und Ansichten und gespeicherte Prozeduren aktualisiert (aber Vorsicht beim Ausführen auf einem Produktionscomputer):

%Vor%     
Mitch Wheat 07.05.2010 00:12
quelle