2013-02-28 14 views
5

Obecnie korzystam z Microsoft Enterprise Library Data Access 5.0, aby wykonać procedurę składowaną.Skrypt SQL trwa długo, aby uruchomić

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

Wszystko działa, jednak uruchomienie zajmuje wiele czasu. Po włączeniu programu SQL Profiler widzę, że procedura przechowywana trwa około 50 sekund. Jeśli jednak weźmiemy te same skrypty z Profiler i uruchomimy je w SQL Management Studio, do zwrócenia wszystkich wierszy potrzeba tylko około 480 milisekund.

Czy ktoś napotkał ten problem? Dlaczego jest duża różnica?

+0

zmienia się, jeśli usuniesz pętlę while? – JeremyWeir

+0

Muszę spróbować i zobaczyć. – madatanic

+0

To pytanie pojawia się kilka razy w tygodniu na forum MSDN SQL; to też musi być duplikat. Zapomniałem dokładnej przyczyny, ale jest to ustawienie domyślne, które należy poprawić. –

Odpowiedz

1

Może być łatwo Parameter Sniffing.

+0

Tak, to kolejna dobra możliwa przyczyna; nie o tym myślał. –

0

Spróbuj zmienić typ parametru ciągu na DbType.AnsiString i sprawdź, czy to pomaga.
Problem może polegać na tym, że jeśli kolumna bazy danych jest varchar (...) i ma indeks oraz parametr pasujący do tej kolumny to nvarchar (...) to SQL Server ignoruje indeks i wykonuje skanowanie tabeli. Rozwiązaniem jest wymuszenie parametru na typ AnsiString, aby SQL Server używał indeksu.

Powiązane problemy