Поделиться через


Рекомендации по использованию подсказок Query Store

Применимо к: SQL Server 2022 (16.x) и более поздних версий базы данных SQLAzure Для Управляемого экземпляраSQL Azure в Microsoft Fabric

В этой статье описаны рекомендации по использованию Query Store hints. Указания хранилища запросов позволяют формировать фигуры плана запроса без изменения кода приложения.

Варианты использования подсказок хранилища запросов

Рассмотрим следующие оптимальные варианты использования подсказок хранилища запросов. Дополнительные сведения см. в разделе Когда следует использовать указания хранилища запросов.

Caution

Так как оптимизатор запросов SQL Server обычно выбирает оптимальный план выполнения для запроса, мы рекомендуем использовать только указания в качестве последнего средства для опытных разработчиков и администраторов баз данных. Дополнительные сведения см. в подсказках к запросам.

Когда невозможно изменить код

Использование указаний хранилища запросов позволяет влиять на планы выполнения запросов без изменения кода приложения или объектов базы данных. Никакие другие особенности не позволяют быстро и легко применять подсказки для запросов.

Вы можете использовать подсказки Query Store, например, для оптимизации рабочих процессов извлечения, преобразования и загрузки данных (ETL), без повторного развертывания кода. Узнайте, как улучшить массовую загрузку с помощью указаний хранилища запросов, посмотрев это 14-минутное видео:

Указания хранилища запросов — это упрощенные методы настройки запросов, но если запрос становится проблематичным, его проблемы следует решать путем более значительных изменений кода. Если вы регулярно ищете необходимость применения подсказок хранилища запросов к запросу, рассмотрите возможность перезаписи большего объема запросов. Оптимизатор запросов SQL Server обычно выбирает оптимальный план выполнения для запроса. Мы рекомендуем использовать только указания в качестве последнего средства для опытных разработчиков и администраторов баз данных.

Сведения о том, какие указания запросов можно применять, см. в разделе Поддерживаемые указания запросов.

При высокой транзакционной нагрузке или с критически важным кодом

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

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

В качестве замены руководств по плану

До появления указаний хранилища запросов разработчику приходилось полагаться на руководства по планам для выполнения аналогичных задач, что нередко было сложно использовать. Указания хранилища запросов интегрированы с функциями хранилища запросов SQL Server Management Studio (SSMS) для визуального изучения запросов.

При помощи руководств по планам необходим поиск по всем планам, используя фрагменты запросов. Функция подсказок Query Store не требует точного совпадения запросов для влияния на результирующий план выполнения запроса. Указания хранилища запросов можно применять к query_id в наборе данных хранилища запросов.

Подсказки Query Store переопределяют жестко закодированные подсказки на уровне инструкций и существующие план-гиды.

Рассмотрите новый уровень совместимости

Указания хранилища запросов могут быть ценным методом, если более новый уровень совместимости базы данных недоступен для вас из-за спецификации поставщика или более крупных задержек тестирования, например. Если для базы данных доступен более высокий уровень совместимости, рассмотрите возможность обновления уровня совместимости базы данных отдельного запроса, чтобы воспользоваться преимуществами последних оптимизаций производительности и функций SQL Server.

Например, если у вас есть экземпляр SQL Server 2022 (16.x) с базой данных на уровне совместимости 140, можно по-прежнему использовать хранилище запросов указания для выполнения отдельных запросов на уровне совместимости 160. Можно использовать следующее указание:

EXEC sys.sp_query_store_set_hints @query_id= 39, @query_hints = N'OPTION(USE HINT(''QUERY_OPTIMIZER_COMPATIBILITY_LEVEL_160''))';

Для полного учебника см. Примеры подсказок хранилища запросов.

Рассмотрите более старый уровень совместимости после обновления

Другой случай, когда подсказки хранилища запросов могут помочь, заключается в том, что запросы нельзя изменять непосредственно после миграции или обновления экземпляра SQL Server. Используйте подсказки хранилища запросов, чтобы применить предыдущий уровень совместимости для запроса, пока его нельзя переписать или иным образом не обеспечить его хорошее выполнение на последнем уровне совместимости. Определите аномальные запросы, которые дали регрессию с более высоким уровнем совместимости, с помощью отчета о регрессированных запросах Query Store, используя инструмент помощник по настройке запросов во время миграции, или другие данные телеметрии уровня отдельных запросов. Дополнительные сведения о различиях между уровнями совместимости см. в разделе "Различия между уровнями совместимости".

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

Блокировать будущие выполнение проблемных запросов

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

Note

В настоящее время указание запроса ABORT_QUERY_EXECUTION (предварительная версия) доступно только в базе данных SQL Azure и предварительной версии SQL Server 2025 (17.x).

Например, чтобы заблокировать будущее выполнение query_id 39, выполните sys.sp_query_store_set_hints следующим образом:

EXEC sys.sp_query_store_set_hints
     @query_id = 39,
     @query_hints = N'OPTION (USE HINT (''ABORT_QUERY_EXECUTION''))';

Дополнительные сведения см. в примерах подсказок хранилища запросов.

Действуют следующие ограничения:

  • При указании этого указания для запроса попытка выполнить запрос завершается ошибкой 8778, серьезностью 16, выполнение запроса прервано, так как указан ABORT_QUERY_EXECUTION указание.

  • Чтобы разблокировать запрос, можно очистить подсказку, передав значение query_id параметру @query_id в хранимой процедуре sys.sp_query_store_clear_hints.

  • Системные представления можно использовать для поиска запросов в хранилище запросов, заблокированных, как показано в следующем примере запроса:

    SELECT qsh.query_id,
           q.query_hash,
           qt.query_sql_text
    FROM sys.query_store_query_hints AS qsh
    INNER JOIN sys.query_store_query AS q
    ON qsh.query_id = q.query_id
    INNER JOIN sys.query_store_query_text AS qt
    ON q.query_text_id = qt.query_text_id
    WHERE UPPER(qsh.query_hint_text) LIKE '%ABORT[_]QUERY[_]EXECUTION%'
    
  • Чтобы получить значение query_id, необходимо записать как минимум одно выполнение запроса в хранилище запросов. Это выполнение не обязательно должно быть успешным. Это означает, что в будущем выполнение истекающих или отмененных запросов может быть заблокировано.

  • Если вам нужно заблокировать или разблокировать все запросы с определенным хэшом запросов, рассмотрите возможность использования скрипта автоматизации. Например, dbo.sp_query_store_modify_hints_by_query_hash — это пример хранимой процедуры, которая циклически вызывает sys.sp_query_store_set_hints системную хранимую процедуру или sys.sp_query_store_clear_hints хранимую процедуру для всех значений query_id, соответствующих хэшу запроса.

  • Если запрос уже выполняется при его блокировке, его выполнение продолжается. Инструкцию KILL можно использовать для прерывания запроса.

    • Выполнение убитых запросов не записывается в хранилище запросов. Если запрос еще не находится в хранилище запросов, необходимо дождаться завершения выполнения запроса или его тайм-аута, чтобы получить query_id, который можно заблокировать.
  • Если запрос блокируется ABORT_QUERY_EXECUTION указанием, execution_type для столбцов execution_type_desc в представлении sys.query_store_runtime_stats задано значение 4 и исключение соответственно.

  • Как и во всех указаниях хранилища запросов, необходимо иметь ALTER разрешение на базу данных, чтобы задать и очистить подсказку ABORT_QUERY_EXECUTION .

Рекомендации по подсказкам хранилища запросов Query Store

При развертывании подсказок Query Store учитывайте следующие сценарии.

Изменения распределения данных

Руководства по планам, принуждение к использованию планов через хранилище запросов и подсказки хранилища запросов переопределяют процесс принятия решений оптимизатора. Указание хранилища запросов может оказаться полезным сейчас, но не в будущем. Например, если указание хранилища запросов помогает запросу в предыдущем распределении данных, это может оказаться контрпродуктивным, если крупномасштабные операции DML изменяют данные. Новое распределение данных может привести к тому, что оптимизатор принимает лучшее решение, чем указание. Этот сценарий является наиболее распространенным следствием принуждения плана к определенному поведению.

Регулярно пересматривайте стратегию подсказок для хранилища запросов.

Переоценьте имеющуюся стратегию подсказок хранилища запросов в следующих случаях:

  • После известных изменений распределения больших данных.
  • Когда ресурсы, доступные для базы данных, изменяются. Например, если размер вычислительных ресурсов базы данных SQL Azure, Управляемого экземпляра SQL или виртуальной машины SQL Server изменяется.
  • Когда исправление плана становится долгосрочным. Указания хранилища запросов лучше всего использовать для краткосрочных исправлений.
  • Непредвиденные регрессии производительности.

Широкий потенциал воздействия

Подсказки хранилища запросов влияют на все выполнение запроса, независимо от набора параметров, исходного приложения, пользователя или результирующих наборов. В случае регрессии производительности по случайности, подсказки в хранилище запросов, созданные с помощью sys.sp_query_store_set_hints, можно легко удалить с помощью sys.sp_query_store_clear_hints.

Тщательно проверяйте изменения нагрузочных тестов для критически важных или конфиденциальных систем перед применением указаний хранилища запросов в рабочей среде.

Принудительная параметризация и указание RECOMPILE не поддерживаются

Применение указания RECOMPILE вместе с указаниями хранилища запросов не поддерживается, если опция базы данных PARAMETERIZATION установлена в значение FORCED. См. рекомендации по использованию принудительной параметризации.

Указание RECOMPILE несовместимо с принудительной параметризацией на уровне базы данных. Если база данных использует принудительное параметризация, а RECOMPILE указание является частью строки подсказок, заданной в хранилище запросов для запроса, ядро СУБД игнорирует RECOMPILE указание и применяет другие указания, если указано. Кроме того, начиная с июля 2022 года в Базе данных SQL Azure, выдается предупреждение (код ошибки 12461) о том, что RECOMPILE указание было проигнорировано.

Сведения о том, какие указания запросов можно применять, см. в разделе Поддерживаемые указания запросов.