Рекомендации по использованию указаний хранилища запросов

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

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

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

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

Внимание

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

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

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

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

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

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

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

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

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

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

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

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

Указания хранилища запросов переопределяют жестко заданные указания на уровне инструкции и существующие структуры плана.

Более новый уровень совместимости

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

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

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

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

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

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

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

Выполняйте переоценку существующей стратегии указаний хранилища запросов в следующих случаях.

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

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

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

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

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

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

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

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

См. также

Далее