Хранилище запросов SQL Server. Что такое специальный запрос?

10

Я глубоко погрузился в хранилище запросов SQL Server и часто вижу ссылки на специальные запросы. Тем не менее, я не видел, как Query Store определяет специальный запрос. Я видел места, где можно сделать вывод, что это запрос без параметров или запрос, выполненный только один раз. Существует ли для этого формальное определение? Я не имею в виду в целом. Я имею в виду, как это относится к Query Store.

В качестве примера на этой странице показан пример удаления специальных запросов из хранилища запросов, но, похоже, что используемые им критерии - это счетчик выполнения только одного. Это кажется странным определением специального запроса. Кстати, если вы перейдете на страницу, выполните поиск «Удалить специальные запросы».

Рэнди Миндер
источник
Смотрите этот вопрос. stackoverflow.com/questions/2460954/what-is-ad-hoc-query
SqlWorldWide
@SqlWorldWide - я перефразировал мой вопрос. Я не имею в виду в целом. Я имею в виду, как это относится к Query Store.
Рэнди Миндер
Как настроено хранилище запросов - все или авто?
Кин Шах
@Kin - Это установлено как Авто
Рэнди Миндер

Ответы:

8

После небольшого поиска я не смог найти конкретный и удовлетворительный источник из документации 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, ваша специальная рабочая нагрузка генерирует разные запросы.

Это, конечно, для запросов, которые еще не используются в качестве хранимых процедур, параметризации и т. Д., Поскольку они могут быть распознаны и обработаны надлежащим образом сразу же.

На основании всего этого можно сказать, что запрос обрабатывается как специальный, если:

  • Не параметризован
  • Он не хранится в базе данных программно (сохраняются процедуры, функции, триггеры и т. Д.)
  • Один и тот же запрос выполняется только один раз ИЛИ Один и тот же запрос выполняется несколько раз, но для каждого последующего выполнения создается другой план запроса.
LowlyDBA
источник
4

Для специальных запросов столбец object_id в sys.query_store_queryDMV будет равен 0, как указано в документации sys.query_store_query :

идентификатор_объекта :

Идентификатор объекта базы данных, частью которого является запрос (хранимая процедура, триггер, CLR UDF / UDAgg и т. Д.). 0, если запрос не выполняется как часть объекта базы данных (специальный запрос).

Вы можете идентифицировать запросы одноранговых на основе этого значения, даже если это прямо не указано, «это определение из специальных запросов ». :)

Ригерта Демири
источник
0

Термин ad-hoc используется для обозначения запросов, которые были выполнены только один раз. Это соответствует определению, используемому для параметра базы данных «Оптимизация для специальных рабочих нагрузок».

Ссылка, на которую вы ссылаетесь в отношении удаления специальных запросов, включает в себя это конкретное определение «Удалить специальные запросы. При этом удаляются запросы, которые были выполнены только один раз и имеют возраст более 24 часов».

Мэтью МакГиффен
источник
0

Ad-hoc из столбца sys.dm_exec_cached_plans dmv objtypeв docs.microsoft.com.

Adhoc: специальный запрос. Относится к Transact-SQL, представленному как языковые события с использованием osql или sqlcmd вместо вызовов удаленных процедур.

Одно из применений этого столбца - в случае запросов с несколькими планами увидеть, вызваны ли эти несколько планов Adhoc.

    SELECT  DISTINCT 
        QCP.objtype
        ,MultipleQ.PlanCount
        ,qStat.query_hash
        ,sText.text AS QueryText
FROM ( 
        SELECT query_hash,
               COUNT(query_hash) AS PlanCount
        FROM sys.dm_exec_query_stats
        GROUP BY query_hash
    ) AS MultipleQ
INNER JOIN sys.dm_exec_query_stats qStat ON MultipleQ.query_hash = qStat.query_hash
INNER JOIN sys.dm_exec_cached_plans  QCP
    ON QCP.plan_handle = qStat.plan_handle
CROSS APPLY sys.dm_exec_sql_text(qStat.sql_handle) AS sText
CROSS APPLY sys.dm_exec_query_plan(qStat.plan_handle) AS qp
WHERE PlanCount > 1
ORDER BY MultipleQ.PlanCount DESC
LCJ
источник