Магазин запитів SQL Server - що вважається спеціальним запитом?


10

Я займаюся глибоким зануренням у магазин запитів SQL Server, і часто бачу посилання на спеціальні запити. Однак я не бачив, який магазин запитів визначає спеціальний запит. Я бачив місця, де можна було б зробити висновок, що це запит без параметрів або запит, виконаний лише один раз. Чи існує для цього формальне визначення? Я взагалі не маю на увазі. Я маю на увазі, як це стосується магазину запитів.

Як приклад, на цій сторінці показаний приклад видалення спеціальних запитів із магазину запитів, але, схоже, критерії, якими вона користується, - це кількість виконання лише одного. Це здається дивним визначенням спеціального запиту. BTW, якщо ви переходите на сторінку, знайдіть "Видалити спеціальні запити".



@SqlWorldWide - я переформулював своє запитання. Я взагалі не маю на увазі. Я маю на увазі, як це стосується магазину запитів.
Ренді Міндер

Як налаштовано ваш магазин запитів - все або автоматично?
Кін Шах

@Kin - Встановлено як Auto
Randy Minder

Відповіді:


8

Після невеликого пошуку я не зміг знайти конкретного та задоволеного джерела з документації Microsoft, щоб відповісти на це питання. Існує багато хороших описів та визначення сторонніх сторін adhoc / ad-hoc / ad hoc, але для специфіки цього питання я думаю, що одне з джерел є ідеальним.

Переміщуючи минулі загальні (але все-таки точні) визначення, такі, як ця публікація SO (дякую SqlWorldWide), якщо ми подивимось, що документація пише на цю тему, вона погоджується з тим, що ви згадали про визначення, яке базується на кількості страт , Я думаю, що ми можемо сприймати це як факт.

У статті про оптимізацію спеціальних робочих процесів сказано:

Коли для цього параметра встановлено значення 1, Engine Database Engine зберігає невелику скомпільовану заглушку плану в кеші плану, коли пакет складається вперше замість повного складеного плану. Це допомагає зняти тиск пам'яті, не дозволяючи кешу плану заповнити складені плани, які не використовуються повторно. Скомпільована заглушка плану дозволяє двигуну баз даних визнати, що ця спеціальна партія була складена раніше, але вона зберігала лише скомпільований заглушку плану, тому коли ця партія знову викликається (компілюється або виконується), механізм бази даних збирає пакетний пакет ... і додає повний складений план до кешу плану.

Таким чином, здавалося б, параметр налаштування сервера ad hoc запитів також використовує визначення одного виконання як визначення ad hoc. Якщо запит продовжує виконуватись і генерує той самий план, він більше не розглядатиметься як такий.

Стаття про кращі практики для магазину запитів також узгоджується з цим,

Порівняйте кількість різних значень query_hash із загальною кількістю записів у sys.query_store_query. Якщо коефіцієнт близький до 1, додаткове робоче навантаження генерує різні запити.

Це, звичайно, стосується запитів, які вже не використовуються як збережені процедури, параметризовані тощо, тому що їх можна розпізнати та обробити належним чином прямо з вати.

Отже, виходячи з усього цього, можна сказати, що запит трактується як спеціальний, якщо:

  • Він не параметризований
  • Він не програмно зберігається в базі даних (зберігається прок, функція, тригер тощо)
  • Один і той же запит виконується лише один раз АБО Той самий запит виконується кілька разів, але генерує інший план запитів для кожного наступного виконання.

4

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

object_id :

Ідентифікатор об'єкта бази даних, до якого входить запит (збережена процедура, тригер, CLR UDF / UDAgg тощо). 0, якщо запит не виконується як частина об'єкта бази даних (спеціальний запит).

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


0

Термін ad-hoc використовується для позначення запитів, які були виконані лише один раз. Це відповідає визначенню, яке використовується для налаштування бази даних "Оптимізація для спеціальних навантажень".

Посилання, на яке ви посилаєтесь, стосується видалення спеціальних запитів, включає це конкретне визначення "Видалити спеціальні запити. Це видаляє запити, які були виконані лише один раз і віком більше 24 годин".


0

Спеціальний з колонки 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

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.