OPTION (RECOMPILE) всегда быстрее; Почему?

Я столкнулся со странной ситуацией, когда добавлениеOPTION (RECOMPILE) мой запрос приводит к тому, что он выполняется за полсекунды, а если его опустить, запрос занимает более пяти минут.

Это тот случай, когда запрос выполняется из Query Analyzer или из моей программы на C # черезSqlCommand.ExecuteReader(), Звонить (или не звонить)DBCC FREEPROCCACHE или жеDBCC dropcleanbuffers не имеет значения; Результаты запроса всегда возвращаются мгновенно сOPTION (RECOMPILE) и больше пяти минут без него. Запрос всегда вызывается с одинаковыми параметрами [ради этого теста].

Я использую SQL Server 2008.

Я довольно удобно писать SQL, но никогда не использовалOPTION Команда в запросе раньше и была незнакома с всей концепцией плана кеширования до сканирования постов на этом форуме. Мое понимание из постов заключается в том, чтоOPTION (RECOMPILE) это дорогая операция. По-видимому, это создает новую стратегию поиска для запроса. Так почему же тогда последующие запросы, которые опускаютOPTION (RECOMPILE) так медленно? Разве последующие запросы не должны использовать стратегию поиска, которая была вычислена на предыдущем вызове, который включал подсказку перекомпиляции?

Весьма необычно иметь запрос, который требует подсказки перекомпиляции при каждом вызове?

Извините за вопрос начального уровня, но я не могу этого сделать.

ОБНОВЛЕНИЕ: меня попросили опубликовать запрос ...

select acctNo,min(date) earliestDate 
from( 
    select acctNo,tradeDate as date 
    from datafeed_trans 
    where feedid=@feedID and feedDate=@feedDate 

    union 

    select acctNo,feedDate as date 
    from datafeed_money 
    where feedid=@feedID and feedDate=@feedDate 

    union 

    select acctNo,feedDate as date 
    from datafeed_jnl 
    where feedid=@feedID and feedDate=@feedDate 
)t1 
group by t1.acctNo
OPTION(RECOMPILE)

При запуске теста из Query Analyzer я добавляю следующие строки:

declare @feedID int
select @feedID=20

declare @feedDate datetime
select @feedDate='1/2/2009'

При вызове из моей программы на C # параметры передаются черезSqlCommand.Parameters свойство.

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

Ответы на вопрос(5)

Ваш ответ на вопрос