Якщо ввімкнути опцію " Оптимізація спеціальних робочих навантажень ", ви спричините, що спеціальні запити, які виконуються вдруге, будуть такими ж повільними, як і 1-й, оскільки ви будете складати план виконання та витягувати ті самі дані ( без кешування) ті перші 2 рази.
Це може не бути великою справою, але ви помітите це під час тестування запитів.
То що ж відбувається зараз, не ввімкнувши цю опцію та кеш, наповнений одноразовими спеціальними запитами?
Алгоритм кешування кешування:
Після введення цієї функції оптимізації алгоритм кешування кешування також був оновлений.
У статті Кімберлі Тріпп також згадується публікація Калена Делані про зміну цього алгоритму.
Вона це найкраще пояснює:
Зміна фактично обчислює розмір кешу плану, при якому SQL Server визнає, що є тиск у пам'яті, і він почне видаляти плани з кешу. Плани, які слід зняти, - це дешеві плани, які не використовувались повторно, і це ДОБРО.
Це означає, що ті примхливі одноразові плани будуть першими, коли потрібно звільнити ресурси.
Тож тепер стає питання:
" Чому ми потребуємо" оптимізації робочих навантажень ", коли SQL Server піклується про видалення невикористаних планів, коли це необхідно? "
Моєю відповіддю є те, що якщо ви регулярно маєте s-тонну динамічного квадратного генерування ювелів не параметризованих оголошень -hoc запити, то має сенс увімкнути цю функцію.
Ви хочете уникнути навантаження на системні ресурси, щоб змусити видалити кешований план / дані після того, як ви використали максимальний простір кеш-пам'яті.
Як я знаю, коли мені потрібно це ввімкнути?
Ось запит, який я написав, щоб показати вам, скільки спеціальних планів ви зараз кешували та скільки місця на диску вони з'їдають (результати змінюватимуться протягом дня - тому протестуйте це під час великого навантаження):
--Great query for making the argument to use "Optimize for Ad Hoc Workloads":
SELECT S.CacheType, S.Avg_Use, S.Avg_Multi_Use,
S.Total_Plan_3orMore_Use, S.Total_Plan_2_Use, S.Total_Plan_1_Use, S.Total_Plan,
CAST( (S.Total_Plan_1_Use * 1.0 / S.Total_Plan) as Decimal(18,2) )[Pct_Plan_1_Use],
S.Total_MB_1_Use, S.Total_MB,
CAST( (S.Total_MB_1_Use * 1.0 / S.Total_MB ) as Decimal(18,2) )[Pct_MB_1_Use]
FROM
(
SELECT CP.objtype[CacheType],
COUNT(*)[Total_Plan],
SUM(CASE WHEN CP.usecounts > 2 THEN 1 ELSE 0 END)[Total_Plan_3orMore_Use],
SUM(CASE WHEN CP.usecounts = 2 THEN 1 ELSE 0 END)[Total_Plan_2_Use],
SUM(CASE WHEN CP.usecounts = 1 THEN 1 ELSE 0 END)[Total_Plan_1_Use],
CAST((SUM(CP.size_in_bytes * 1.0) / 1024 / 1024) as Decimal(12,2) )[Total_MB],
CAST((SUM(CASE WHEN CP.usecounts = 1 THEN (CP.size_in_bytes * 1.0) ELSE 0 END)
/ 1024 / 1024) as Decimal(18,2) )[Total_MB_1_Use],
CAST(AVG(CP.usecounts * 1.0) as Decimal(12,2))[Avg_Use],
CAST(AVG(CASE WHEN CP.usecounts > 1 THEN (CP.usecounts * 1.0)
ELSE NULL END) as Decimal(12,2))[Avg_Multi_Use]
FROM sys.dm_exec_cached_plans as CP
GROUP BY CP.objtype
) AS S
ORDER BY S.CacheType
Результати:
Я не збираюся говорити: " Коли у вас є X MB " або " Якщо X% вашої рекламної програми є одноразовою ", щоб увімкнути це.
Це не впливає на Sprocs, тригери, перегляди або параметризований / підготовлений SQL - лише спеціальні запити.
Моя особиста рекомендація - просто увімкнути вашу програму Prod Environment, але подумайте про те, щоб залишити її у вашому середовищі Dev.
Я говорю це лише для Dev, тому що якщо ви оптимізуєте запит, який потребує хвилини або більше, то ви не хочете запускати його 3 рази, перш ніж ви зможете побачити, наскільки швидко він піде з кешованим керуванням - кожен одноразово редагуючи його, щоб знайти найкращий дизайн оптимізації.
Якщо ваша робота не передбачає цього робити цілий день, то згорбіть і попросіть DBA включити її скрізь.