Unterschiedliche Laufzeiten in Management Studio und ADO.NET

24/07/2008 - 14:10 von Frank Faster | Report spam
Hallo NG,

der Aufruf einer Prozedur làuft bei uns aus dem Management Studio 10
Sekunden. Der gleiche Aufruf dauert aus NET heraus 10 Minuten!
Das Aktualisieren der Sql Server Statistiken behebt das Problem
vorübergehend.

// CODE START
sqlCommand.CommandType = CommandType.StoredProcedure;
sqlCommand.Parameters.AddWithValue("@transaktion", transaktion);
sqlCommand.Parameters.AddWithValue("@mandant", mandant);
sqlCommand.CommandTimeout = int.MaxValue;
SqlDataReader sqlDataReader = cmd.ExecuteReader(); //dauert bis zu 10
Minuten
dataTable.Load(sqlDataReader); // geht schnell ;)
// CODE END

Wie gesagt, dauert der gleiche Aufruf mit neuen Parametern (Pufferung im SQL
Server umgehen) aus dem Management Studio 10 Sekunden.

Ist ein entsprechendes Problem mit dem DataProvider bekannt?

Umgebung:
SQL Server 2005 Professional
Visual Studio 2008
.NET 2.0

TIA, Frank
 

Lesen sie die antworten

#1 Elmar Boye
24/07/2008 - 16:40 | Warnen spam
Hallo Frank,

Frank Faster schrieb:
der Aufruf einer Prozedur làuft bei uns aus dem Management Studio 10
Sekunden. Der gleiche Aufruf dauert aus NET heraus 10 Minuten!



Das Problem dürften ungünstige Ausführungsplàne sein,
die sich durch wechselnde Datenkonstellationen ergeben.
Der SQL Server erstellt den Ausführungsplan einer Prozedur
beim ersten Aufruf anhand der übergebenen Parameter
und nutzt diese anschließend solange weiter, wie keine
größeren Änderungen an den Tabellen stattfinden.

Das Aktualisieren der Sql Server Statistiken behebt das Problem
vorübergehend.



Die automatsche Erstellung und aktualisierung von Statistiken
sollte aktiviert sein, siehe auch
<URL:http://support.microsoft.com/kb/195565/en-us/>

SqlDataReader sqlDataReader = cmd.ExecuteReader(); //dauert bis zu 10 Minuten
dataTable.Load(sqlDataReader); // geht schnell ;)



Load führt am Ende ebenfalls ein ExecuteReader aus ...

Wie gesagt, dauert der gleiche Aufruf mit neuen Parametern
(Pufferung im SQL Server umgehen) aus dem Management Studio 10 Sekunden.



... und auch das Management Studio nutzt den Sql Client Provider
und ExecuteReader. Da gibt es also keine spezielle Magie.

Es hàngt davon ab, welche Anweisungen in der Prozedur ausgeführt werden.
Für Prozeduren, die sehr unterschiedliche Ergebnisse liefern können
kann die Option WITH RECOMPILE helfen. Beachte aber, das jedes mal
die Prozedur übersetzt wird, und so die Kosten für Übersetzung hinzukommen.
Hintergründe vermittelt dazu: <URL:http://support.microsoft.com/kb/243586/en-us/>

Eine Alternative kann ein Plan Guide sein, der für die kritischen Anweisungen
die (normalerweise) günstigsten Parameter angibt:
<URL:http://msdn.microsoft.com/de-de/lib...7.aspx>

Gruß Elmar

Ähnliche fragen