2013-02-28 7 views
5

Ich verwende derzeit Microsoft Enterprise Library Data Access 5.0, um eine gespeicherte Prozedur auszuführen.SQL-Skript benötigt lange Zeit

Database myDatabase = DatabaseFactory.CreateDatabase(); 
using (DbCommand command = myDatabase.GetStoredProcCommand("myStoredProc")) 
{ 
    //Add parameters here 
    using (IDataReader dataReader = myDatabase.ExecuteReader(command)) 
    { 
     while (dataReader.Read()) 
     { 
     } 
    } 
} 

Alles funktioniert, aber es dauert eine lange Zeit zu laufen. Wenn ich SQL Profiler aktiviere, kann ich sehen, dass die gespeicherte Prozedur etwa 50 Sekunden benötigt, um ausgeführt zu werden. Wenn ich jedoch dieselben Skripte aus dem Profiler herausbringe und sie in SQL Management Studio ausführe, dauert es nur etwa 480 Millisekunden, um alle Zeilen zurückzugeben.

Ist jemand auf dieses Problem gestoßen? Warum gibt es einen großen Unterschied?

+0

ändert sich das, wenn Sie die while-Schleife entfernen? – JeremyWeir

+0

Ich muss das versuchen und sehen. – madatanic

+0

Diese Frage wird mehrmals pro Woche im MSDN SQL-Forum gestellt. es muss auch ein Duplikat sein. Ich vergesse die genaue Ursache, aber es ist eine Standardeinstellung, die optimiert werden muss. –

Antwort

1

Konnte leicht sein Parameter Sniffing.

+0

Ja, das ist eine andere gute mögliche Ursache; nicht an den, an den man gedacht hat. –

0

Versuchen Sie, Ihren String-Parametertyp auf DbType.AnsiString zu ändern und sehen Sie, ob das hilft.
Das Problem kann sein, dass, wenn die Datenbankspalte varchar (...) ist und einen Index hat und der Parameter dieser Spalte nvarchar (...) entspricht, ignoriert SQL Server den Index und führt einen Tabellenscan durch. Die Lösung besteht darin, den Parameter zum Eingeben von AnsiString zu erzwingen, damit SQL Server den Index verwendet.