SQL Server работает очень медленно при вызове из приложения.NET
У меня есть вызов SQL для хранимой процедуры в моем приложении ASP.NET, используя nHibernate:
GetNamedQuery("MyProc")
.SetString("param1", value1)
.SetString("param2", value2)
...
SQL Server 2005 используется здесь. Он хорошо работает в нашей среде тестирования, этот вызов занимает около 2 секунд. Но когда мы перемещаем его на новый сервер, это начинает занимать очень много времени, и я получил исключение тайм-аута в своем приложении.
Тем не менее, я перехватываю вызовы в SQL Server Profiler и обнаруживаю, что этот работает в течение 30 секунд. Но когда я скопировал тот же запрос и просто запустил его на сервере, он завершился за 2 секунды.
Таким образом, вопрос в том, что может повлиять на рабочие запросы из приложения.NET?
1 ответ
Руки вниз, наиболее полное решение (я) для этого типа проблемы находится здесь, одна из лучших письменных частей по этому вопросу. Если вы передаете параметры в хранимую процедуру из внешнего приложения, один быстрый взлом к этому, который работает 80% времени, - это локализация параметров в процедуре:
CREATE PROCEDURE sp_Test
@VarOne INT, @VarTwo INT
AS
BEGIN
DECLARE @VOne INT, @VTwo INT
SET @VOne = @VarOne
SET @VTwo = @VarTwo
/* Rest of code only uses @VOne and @VTwo for parameters */
END
Это предполагает, однако, что у вас есть параметры в вашем приложении, которые нужны хранимой процедуре (как это выглядит из краткого фрагмента кода, который вы опубликовали). В противном случае предоставленная ссылка также очерчивает некоторые другие упущения, и я настоятельно рекомендую ее всем, кто устраняет неполадки производительности из внешнего приложения.