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

176
02 февраля 2018, 18:58

Есть хранимая процедура в 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.

Answer 1

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

Попробую объяснить, как я это понял, и если ошибаюсь, поправьте пожалуйста. Итак, тормозило все из-за того, что в внутри основной процедуры сначала вычислялся параметр, а потом этот параметр использовался для вызова других 5 процедур. Удалось отказаться от вычисляемого параметра в пользу константы и SQL смог оптимально построить план выполнения для вызываемых процедур. А в Managment Studio это значения вычислялось в процессе выполнения и план так же создавался "на лету", отсюда и более быстрое выполнение. Буду копать дальше, т.к. не всегда будет возможность отказаться от вычисляемого параметра.

READ ALSO
unity зависает Application.Quit

unity зависает Application.Quit

при вызове метода ApplicationQuit - зависает игра на 3-4 секунды и только потом закрывается, иногда у некоторых перезапускается

169
Unity - вызвать метод в игре в заданную дату

Unity - вызвать метод в игре в заданную дату

игра на Android, допустим есть некий метод, его необходимо привести в действие начиная с определенной даты, допустим сегодня 0202

200
async/await и создание потоков

async/await и создание потоков

Прочитал несколько источников про async/await, где писалось, что якобы никаких дополнительных потоков эти конструкции не создают

174
шина данных и pub/sub

шина данных и pub/sub

здравствуйте, пытаюсь понять что такое шина данных/шина сообщений(message bus) в распределенных системах

164