Параметр конфигурации сервера «optimize for ad hoc workloads»

Применимо к: даSQL Server (все поддерживаемые версии) ДаБаза данных SQL Azure ДаУправляемый экземпляр SQL Azure даПараллельное хранилище данных

Параметр optimize for ad hoc workloads используется для повышения эффективности кэширования планов рабочих нагрузок, содержащих много отдельных нерегламентированных пакетов. Если этот параметр имеет значение 1, то при первой сборке пакета ядро СУБД сохраняет в кэше планов небольшую скомпилированную "заглушку" плана, а не полный план. Это уменьшает нагрузку на память, чтобы кэш не наполнялся скомпилированными планами, которые не будут использоваться повторно.

Откомпилированная заглушка плана позволяет компоненту Компонент Database Engine понять, что данный нерегламентированный пакет компилировался ранее, но от него сохранилась только заглушка. При повторном вызове этого пакета для компиляции или выполнения компонент Компонент Database Engine откомпилирует пакет, удалит из кэша планов откомпилированную заглушку плана и добавит туда полный скомпилированный план.

Скомпилированная заглушка плана принадлежит к объектам cacheobjtypes, которые можно просмотреть в представлении каталога sys.dm_exec_cached_plans. У каждой заглушки есть уникальный дескриптор SQL и дескриптор плана. Скомпилированная "заглушка" плана не имеет связанного плана выполнения, и запрос по дескриптору плана не возвращает данных XML Showplan.

Флаг трассировки 8032 восстанавливает параметры лимита кэша из версии SQL Server 2005 (9.x) RTM, которые обычно допускают кэши большего размера. Используйте этот флаг, когда в кэш не помещаются многократно используемые записи и когда параметр optimize for ad hoc workloads Server Configuration Option не решает проблему с кэшем планов.

Предупреждение

Применение флага трассировки 8032 может привести к снижению производительности, если увеличение кэша приводит к уменьшению объема памяти, доступной для других потребителей памяти, например для буферного пула.

Рекомендации

Старайтесь, чтобы в кэше планов не находилось много планов разового применения. Такая проблема часто возникает при несогласованных определениях типов данных параметров запроса. Это относится в первую очередь к длине строк, но может случаться с любыми типами данных, имеющими максимальную длину, точность или масштаб. Например, если параметр с именем @Greeting передается как nvarchar(10) в одном вызове и как nvarchar(20) в следующем вызове, для каждого размера параметра создаются отдельные планы. Если запрос имеет несколько параметров и они не определяются согласованно при вызове, может существовать большое количество планов для каждого запроса. Для каждого сочетания используемых длин и типов данных параметров запроса могут иметься отдельные планы.

Если число одноразовых планов занимает существенную часть памяти компонента Компонент SQL Server Database Engine на сервере OLTP и эти планы являются нерегламентированными, используйте этот параметр сервера для уменьшения объема используемой этими объектами памяти. Чтобы найти количество одноразовых кэшированных планов, выполните следующий запрос:

SELECT objtype, cacheobjtype, 
  AVG(usecounts) AS Avg_UseCount, 
  SUM(refcounts) AS AllRefObjects, 
  SUM(CAST(size_in_bytes AS bigint))/1024/1024 AS Size_MB
FROM sys.dm_exec_cached_plans
WHERE objtype = 'Adhoc' AND usecounts = 1
GROUP BY objtype, cacheobjtype;

Важно!

Когда параметру optimize for ad hoc workloads присваивается значение 1, это влияет только на новые планы; те планы, которые уже находятся в кэше планов, остаются неизменными. Чтобы немедленно применить параметр к уже кэшированным планам запросов, необходимо очистить кэш планов с помощью инструкции ALTER DATABASE SCOPED CONFIGURATION CLEAR PROCEDURE_CACHE или перезапустить SQL Server.

См. также: