Я столкнулся с нечетной ситуацией, когда добавление OPTION (RECOMPILE)
к моему запросу заставляет его работать через полсекунды, в то время как его исключение заставляет запрос заняться более пяти минут.
Это тот случай, когда запрос выполняется из Query Analyzer или из моей программы С# через 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 [email protected] and [email protected]
union
select acctNo,feedDate as date
from datafeed_money
where [email protected] and [email protected]
union
select acctNo,feedDate as date
from datafeed_jnl
where [email protected] and [email protected]
)t1
group by t1.acctNo
OPTION(RECOMPILE)
При выполнении теста из Query Analyzer я добавляю следующие строки:
declare @feedID int
select @feedID=20
declare @feedDate datetime
select @feedDate='1/2/2009'
При вызове его из моей программы на С# параметры передаются через свойство SqlCommand.Parameters
.
Для целей этого обсуждения вы можете предположить, что параметры никогда не меняются, поэтому мы можем исключить субоптимальный параметр, пахнущий как причину.