Страницы

Поиск по вопросам

пятница, 24 января 2020 г.

Почему хранимая процедура при вызове из C# кода выполняется в 18 раз дольше чем на сервере?

#c_sharp #sql #производительность


Есть хранимая процедура в MS SQL базе. В SQL Server Managment Studio она выполняется
всего за 10 секунд. Но если я запускаю эту же процедуру из C# (ASP.NET), то время выполнения
почему-то увеличивается до 180 секунд!

Вот такой примерно код используется для вызова этой процедуры:

using (SqlConnection connection = new SqlConnection())
{
   connection.ConnectionString = "XXXX";
   string procedure = "dbo.sp_ProcedureName";

   using (SqlCommand command = new SqlCommand(procedure, connection))
   {
      command.CommandType = CommandType.StoredProcedure;
      command.CommandTimeout = XXX;

      connection.Open();
      command.ExecuteNonQuery();
   }
}


В чем может быть причина? Почему так сильно увеличилось время выполнения и как это
можно исправить или минимизировать?

p.s. База на том же сервере стоит, что и код, при обращении к удаленному, длительность
увеличивается секунд на 12. 
    


Ответы

Ответ 1



По совету пользователя Alexander Petrov начал знакомиться со статьей Slow in the Application, Fast in SSMS, внес небольшое изменение в хранимую процедуру и время выполнения стало практическое такое же как во время выполнения в SQL Server Managment Studio, сократившись со 180 сек. до 13. Попробую объяснить, как я это понял, и если ошибаюсь, поправьте пожалуйста. Итак, тормозило все из-за того, что в внутри основной процедуры сначала вычислялся параметр, а потом этот параметр использовался для вызова других 5 процедур. Удалось отказаться от вычисляемого параметра в пользу константы и SQL смог оптимально построить план выполнения для вызываемых процедур. А в Managment Studio это значения вычислялось в процессе выполнения и план так же создавался "на лету", отсюда и более быстрое выполнение. Буду копать дальше, т.к. не всегда будет возможность отказаться от вычисляемого параметра.

Комментариев нет:

Отправить комментарий