Производительность хранимой процедуры - это WILD?

Этот вопрос не столько о поиске решения, сколько о получении объяснения для странного поведения, которое я когда-либо видел от 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 секунды. И команда здесь просто ошарашена.

Итак, дамы и господа, может ли кто-нибудь объяснить такое поведение?

5
задан Drew 9 October 2013 в 02:58
поделиться