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


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

Область применения: SQL Server 2022 (16.x) База данных SQL AzureУправляемый экземпляр SQL Azureбаза данных SQL в Microsoft Fabric

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

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

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

Внимание

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

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

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

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

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

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

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

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

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

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

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

При помощи руководств по планам необходим поиск по всем планам, используя фрагменты запросов. Функция подсказок хранилища запросов не требует точного соответствия запросов для влияния на итоговый план запроса. Указания хранилища запросов можно применять к 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''))';

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

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

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

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

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

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

Примечание.

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

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

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, необходимо записать как минимум одно выполнение запроса в хранилище запросов. Это выполнение не обязательно должно быть успешным. Это означает, что в будущем выполнение истекающих или отмененных запросов может быть заблокировано.
  • Если запрос уже выполняется при его блокировке, его выполнение продолжается. Инструкцию 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 учитывайте следующие сценарии.

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

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

Регулярно переоценивайте стратегию использования подсказок в Хранилище запросов

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

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

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

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

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

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

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

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

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