У мене виникла дивна ситуація, коли додавання 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)
Під час запуску тесту з аналізатора запитів я додаю наступні рядки:
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
. У будь-якому випадку фіксуйте плани виконання та дивіться на відмінності.