Я столкнулся со странной ситуацией, когда добавление 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
свойство.
В целях этого обсуждения вы можете предположить, что параметры никогда не изменяются, поэтому мы можем исключить неоптимальный запах параметра в качестве причины.
X = @X OR @X IS NULL
к X=@X
и выполняющее стремятся видеть здесь или нажав предикаты дальше вниз против зрения с оконными функциями
RECOMPILE
. В любом случае запишите планы выполнения и посмотрите на различия.