У меня есть хранимая процедура, которая безумно истекает каждый раз, когда вызывается из веб-приложения.
Я запустил Sql Profiler и отследил вызовы, которые истекли, и наконец обнаружил следующие вещи:
- При выполнении операторов из MS SQL Management Studio с теми же аргументами (фактически, я скопировал вызов процедуры из трассировки профиля sql и запустил его): он завершается через 5 ~ 6 секунд в среднем.
- Но при вызове из веб-приложения это занимает более 30 секунд (в трассировке), поэтому моя веб-страница к тому времени фактически истекает.
Помимо того, что у моего веб-приложения есть собственный пользователь, все одинаково (та же база данных, соединение, сервер и т. Д.). Я также пробовал запускать запрос непосредственно в студии с пользователем веб-приложения, и это занимает не более 6 сек.
Как узнать, что происходит?
Я предполагаю, что это не имеет ничего общего с тем фактом, что мы используем слои BLL> DAL или адаптеры таблиц, поскольку трассировка ясно показывает, что задержка находится в реальной процедуре. Это все, о чем я могу думать.
ИЗМЕНИТЬ В этой ссылке я узнал, что ADO.NET устанавливает ARITHABORT
значение true - что хорошо в большинстве случаев, но иногда такое случается, и предлагаемое решение - добавить with recompile
параметр в сохраненный процесс. В моем случае это не работает, но я подозреваю, что это очень похоже на это. Кто-нибудь знает, что еще делает ADO.NET или где я могу найти спецификацию?