schlechte Leistung mit SQL-Parameter

8

Ich habe einen Webservice, daher wird der Handler mehrmals gleichzeitig aufgerufen.

Im Inneren erstelle ich SqlConnection und SqlCommand. Ich muss ungefähr 7 verschiedene Befehle ausführen. Verschiedene Befehle erfordern verschiedene Parameter, also füge ich sie einfach einmal hinzu:

%Vor%

Dann während der Ausführung ändere ich nur CommandText prorerty und dann ExecuteNonQuery (); oder ExecuteScalar ();

Und ich habe Probleme mit der Leistung. Zum Beispiel zeigt ein kleines Debugging und Profiling, diesen Befehl

%Vor%

dauert durchschnittlich etwa 50 ms. Wenn ich es ändere zu:

%Vor%

dann dauert es durchschnittlich nur 1ms!

Ich kann einfach keine Ahnung bekommen, wo ich das Problem untersuchen soll.

    
quelle

2 Antworten

13

Das klingt so, als hätte es einen Abfrageplan für einen atypischen @UserID Wert (einen der frühen) zwischengespeichert und verwendet einen schlechten Plan für spätere Abfragen. Dies ist im zweiten Fall kein Problem, da jeder einen separaten Plan enthält. Ich vermute, du musst nur hinzufügen:

%Vor%

zu der Abfrage, wodurch es weniger daran interessiert ist, Pläne blind zu verwenden.

Alternative Theorie:

Sie haben möglicherweise eine Diskrepanz zwischen dem Typ von userID (in C #) und dem Typ von UserID (in der Datenbank). Dies könnte so einfach wie Unicode vs ANSI sein, oder könnte int vs varchar[n] , etc. Im Zweifelsfall, sehr spezifisch bei der Konfiguration des Parameters, um es mit der richtigen Unter hinzufügen Typ und Größe.

Erläuterung

Tatsächlich scheint das Problem hier der Unterschied zwischen einem C # string (Unicode) und der Datenbank varchar(n) (ANSI) zu sein. Das SqlParameter sollte daher explizit als solches hinzugefügt werden ( DbType.AnsiString ).

    
Marc Gravell 21.12.2011, 12:56
quelle
0

Sie senden sieben Mal mehr Daten an den Server, also wird es langsamer.

Auch wenn Ihre userID -Zeichenketten unterschiedliche Längen haben, kann eine explizite Länge im SQL-Parameter die Abfrage besser wiederverwenden.

    
SLaks 21.12.2011 12:56
quelle