Примечание
Для доступа к этой странице требуется авторизация. Вы можете попробовать войти или изменить каталоги.
Для доступа к этой странице требуется авторизация. Вы можете попробовать изменить каталоги.
Применимо к: SQL Server 2022 (16.x) и более поздних версий
базы данных SQL
Azure Для Управляемого экземпляра
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
указание было проигнорировано.
Сведения о том, какие указания запросов можно применять, см. в разделе Поддерживаемые указания запросов.