Хранимая процедура медленно при вызове из сети, быстро из Management Studio

У меня есть хранимая процедура, которая безумно теряет время ожидания каждый раз, когда она вызывается из веб-приложения.

Я запустил Sql Profiler и проследил вызовы, у которых истекло время ожидания, и наконец обнаружил следующие вещи:

  1. При выполнении операторов из MS SQL Management Studio с теми же аргументами (фактически, я скопировал вызов процедуры из трассировки профиля sql и запустил его) : Завершается в среднем через 5 ~ 6 секунд.
  2. Но при вызове из веб-приложения это занимает более 30 секунд (в трассировке), поэтому моя веб-страница к тому времени фактически истекает.

Помимо того, что у моего веб-приложения есть собственный пользователь, все одинаково (одна и та же база данных, соединение, сервер и т. Д.) Я также пробовал выполнить запрос прямо в студии с пользователем веб-приложения, и это заняло не более 6 секунд.

Как мне узнать, что происходит?

Я предполагаю, что это не имеет ничего общего с тем фактом, что мы используем уровни BLL> DAL или адаптеры таблиц, поскольку трассировка ясно показывает, что задержка присутствует в реальной процедуре. Это все, о чем я могу думать.

РЕДАКТИРОВАТЬ В этой ссылке я обнаружил, что ADO.NET устанавливает ARITHABORT в значение true - что хорошо в большинстве случаев но иногда это случается, и предлагаемый обходной путь - добавить с опцией перекомпиляции к сохраненной процедуре. В моем случае это не работает, но я подозреваю, что это очень похоже на это. Кто-нибудь знает, что еще делает ADO.NET или где я могу найти спецификацию?

94
задан ROMANIA_engineer 19 September 2017 в 01:23
поделиться