После небольшого поиска я не смог найти конкретный и удовлетворительный источник из документации Microsoft, чтобы ответить на этот вопрос. Существует много хороших сторонних описаний и определений adhoc / ad-hoc / ad hoc, но для специфичности этого вопроса я думаю, что одно из них близко к источнику идеально.
Переходя от общих (но все еще точных) определений, таких как этот пост SO (спасибо SqlWorldWide), если мы посмотрим, что документация говорит по этой теме, она согласуется с тем, что вы упомянули об определении, основанном на количестве выполнений. Я думаю, что мы можем принять это как факт.
В статье об оптимизации для специальных рабочих процессов говорится:
Если для этого параметра установлено значение 1, компонент Database Engine сохраняет небольшую заглушку скомпилированного плана в кэше планов при первой компиляции пакета вместо полного скомпилированного плана. Это помогает снизить нагрузку на память, не позволяя кэшу планов заполняться скомпилированными планами, которые не используются повторно. Скомпилированная заглушка плана позволяет компоненту Database Engine распознавать, что эта специальная партия была скомпилирована ранее, но сохранила только скомпилированную заглушку плана, поэтому, когда этот пакет вызывается (компилируется или выполняется) снова, компонент Database Engine компилирует пакет ... и добавляет полный скомпилированный план в кэш планов.
Таким образом, может показаться, что опция конфигурации сервера запросов ad hoc также использует определение отдельного выполнения в качестве определения ad hoc. Если запрос продолжает выполняться и генерирует тот же план, он больше не будет рассматриваться как таковой.
Статья о Best Practices для Query Store также согласуется с этим,
Сравните количество различных значений query_hash с общим количеством записей в sys.query_store_query. Если отношение близко к 1, ваша специальная рабочая нагрузка генерирует разные запросы.
Это, конечно, для запросов, которые еще не используются в качестве хранимых процедур, параметризации и т. Д., Поскольку они могут быть распознаны и обработаны надлежащим образом сразу же.
На основании всего этого можно сказать, что запрос обрабатывается как специальный, если:
- Не параметризован
- Он не хранится в базе данных программно (сохраняются процедуры, функции, триггеры и т. Д.)
- Один и тот же запрос выполняется только один раз ИЛИ Один и тот же запрос выполняется несколько раз, но для каждого последующего выполнения создается другой план запроса.