Этот вопрос не столько в поиске решения, сколько в объяснении странного поведения, которое я когда-либо видел в SQL Server.
У меня была хранимая процедура со следующей подписью:
alter procedure MySP @param1 uniqueidentifier,
@param2 uniqueidentifier,
@param3 uniqueidentifier
Учитывая определенный набор параметров, этот процесс занимал очень много времени для запуска из C # (используя SqlCommand.ExecuteReader()
) - около 2 минут. Используя те же параметры в сеансе прямого запроса, SP запускался менее чем за 2 секунды.
Это заняло много времени, и я даже не буду пытаться объяснить, как мы наткнулись на это решение, но вот что мы сделали:
В начале SP мы объявили 3 локальные переменные и присвоили их значениям параметров, например:
declare @param1_copy uniqueidentifier,
@param2_copy uniqueidentifier,
@param3_copy uniqueidentifier
select @param1_copy = @param1,
@param2_copy = @param2,
@param3_copy = @param3
А затем в остальной части SP мы заменили все ссылки на входные параметры локальными копиями.
Вуаля. SP выполняется менее чем за 2 секунды. И команда здесь ошеломлена.
Теперь, дамы и господа, кто-нибудь может объяснить это поведение?