Примечание
Для доступа к этой странице требуется авторизация. Вы можете попробовать войти или изменить каталоги.
Для доступа к этой странице требуется авторизация. Вы можете попробовать изменить каталоги.
Применимо к: SQL Server 2022 (16.x) и более поздних версий базы данных
SQLAzure Для Управляемого экземпляра
SQL Azure в Предварительной версии Microsoft Fabric
В этой статье описывается, как применять подсказки запросов, используя хранилище запросов. Указания хранилища запросов — простой способ формирования планов запросов без изменения кода приложения.
- Дополнительные сведения о настройке и администрировании с помощью хранилища запросов см. в статье "Мониторинг производительности с помощью хранилища запросов".
- Сведения об обнаружении полезных сведений и настройке производительности с помощью хранилища запросов см. в статье Настройка производительности с помощью хранилища запросов.
- Сведения о работе с хранилищем запросов в базе данных SQL Azure см. в разделе Работа с хранилищем запросов в базе данных SQL Azure.
Caution
Так как оптимизатор запросов SQL Server обычно выбирает оптимальный план выполнения для запроса, мы рекомендуем использовать только указания в качестве последнего средства для опытных разработчиков и администраторов баз данных. Дополнительные сведения см. в подсказках к запросам.
Посмотрите это видео с обзором подсказок хранилища запросов.
Overview
В идеале оптимизатор запросов выбирает оптимальный план выполнения для запроса.
Если оптимальный план не выбран, разработчик или администратор базы данных (DBA) может потребоваться вручную оптимизировать для определенных условий. Указания запросов указываются с помощью OPTION
предложения и могут использоваться для влияния на поведение выполнения запроса. Хотя указания запросов помогают решать различные проблемы производительности, они требуют переделки исходного текста запроса. Администраторы и разработчики базы данных могут не всегда вносить изменения непосредственно в код Transact-SQL, чтобы добавить подсказку запроса. Transact-SQL может быть жестко закодирован в приложение или автоматически создан приложением. Ранее разработчику могло потребоваться использовать гиды по плану, которые могут быть сложными для использования.
Подсказки Query Store решают эту проблему, позволяя вводить подсказку запроса в предложение запроса, не изменяя текст Transact-SQL напрямую. Сведения о том, какие указания запросов можно применять, см. в разделе Поддерживаемые указания запросов.
Когда использовать подсказки для хранилища запросов
Как следует из названия, эта функция расширяет возможности хранилища запросов и зависит от него. Хранилище запросов позволяет сохранять сведения о запросах и планах выполнения, а также связанную статистику времени выполнения. хранилище запросов значительно упрощает общее взаимодействие с клиентом по настройке производительности. SQL Server 2016 (13.x) впервые представил хранилище запросов, и теперь он включен по умолчанию в SQL Server 2022 (16.x), Управляемом экземпляре SQL Azure, Базе данных SQL Azure и базе данных SQL в Microsoft Fabric Preview.
Сначала запрос выполняется, а затем записывается в хранилище запросов. Затем администратор базы данных создает подсказку для хранилища запросов в запросе. В дальнейшем запрос выполняется с использованием указания хранилища запросов.
Примеры, в которых указания хранилища запросов могут помочь в решении проблем с производительностью на уровне запросов:
- Перекомпилировать запрос при каждом выполнении.
- Ограничьте размер предоставленного объема памяти для операции массовой вставки.
- Ограничить максимальную степень параллелизма при обновлении статистики.
- Используйте хеш-соединение вместо соединения по вложенным циклам.
- использование уровня совместимости 110 для отдельного запроса с сохранением уровня совместимости 150 для остальной базы данных;
- Отключите оптимизацию цели строки для
SELECT TOP
запроса.
Чтобы использовать подсказки из хранилища запросов:
Определите
query_id
инструкции запроса, которую вам нужно изменить, в хранилище запросов. Это можно сделать различными способами:- Запрос данных по представлениям каталога хранилища запросов (Transact-SQL).
- Использование встроенных отчетов хранилища запросов в SQL Server Management Studio.
- Использование функции Query Performance Insight в портале Azure для Базы данных Azure SQL.
Выполните
sys.sp_query_store_set_hints
с параметромquery_id
и строкой указания запроса, которую вы хотите использовать в запросе. Эта строка может содержать одно или несколько указаний запроса. Подробности см. в sys.sp_query_store_set_hints.
Созданные указания Query Store сохраняются после перезапусков и аварийных переключений. Указания хранилища запросов переопределяют жестко запрограммированные указания на уровне инструкции и существующие указания структуры плана.
Если указание запроса противоречит возможности оптимизации запросов, выполнение запроса не блокируется, а указание не применяется. В случаях, когда указание приведет к сбою запроса, указание игнорируется, а последние сведения о сбое можно просмотреть в sys.query_store_query_hints.
Перед использованием подсказок хранилища запросов
Прежде чем приступить к использованию подсказок хранилища запросов, рассмотрите следующее.
- Завершите обслуживание статистики и обслуживание индексов (при необходимости) перед оценкой запросов для потенциальных новых подсказок хранилища запросов. Обслуживание статистики и, в меньшей степени, обслуживание индекса может устранить проблему, требующую подсказки запроса в противном случае.
- Перед использованием подсказок хранилища запросов протестируйте базу данных приложения на последнем уровне совместимости, чтобы убедиться, решается ли проблема, требующая подсказки для запроса.
- Например, в SQL Server 2022 (16.x) была введена оптимизация плана обработки чувствительных к параметрам (PSP) на уровне совместимости 160. Он использует несколько активных планов для каждого запроса для решения неравномерных распределений данных. Если ваша среда не может использовать последний уровень совместимости, подсказки Query Store с
RECOMPILE
можно использовать на любом поддерживаемом уровне совместимости.
- Например, в SQL Server 2022 (16.x) была введена оптимизация плана обработки чувствительных к параметрам (PSP) на уровне совместимости 160. Он использует несколько активных планов для каждого запроса для решения неравномерных распределений данных. Если ваша среда не может использовать последний уровень совместимости, подсказки Query Store с
- Указания хранилища запросов переопределяют поведение плана запросов ядра СУБД по умолчанию. При необходимости устранять проблемы, связанные с производительностью, следует использовать только указания хранилища запросов.
- Вы должны повторно оценить подсказки хранилища запросов, подсказки на уровне выражений, руководства по планам и принудительные планы хранилища запросов каждый раз, когда изменяется объем и распределение данных, а также во время проектов миграции баз данных. Изменения в объеме и распределении данных могут привести к тому, что подсказки хранилища запросов создают неоптимальные планы выполнения.
Системные хранимые процедуры для подсказок хранилища запросов
Чтобы создать или изменить указания, используйте sys.sp_query_store_set_hints. Указания указываются в допустимом строковом формате N'OPTION (...)'
.
- При создании подсказки хранилища запросов, если для конкретного
query_id
подсказки хранилища запросов нет, создается новая подсказка хранилища запросов. - При создании или обновлении указания для хранилища запросов, если такое указание уже существует для определенного
query_id
, последнее указанное значение переопределяет прежние значения для связанного запроса. - Если
query_id
не существует, возникает ошибка.
Полный список подсказок, поддерживаемых как подсказки хранилища запросов, см. в sys.sp_query_store_set_hints.
Чтобы удалить указания, связанные с query_id
, используйте sys.sp_query_store_clear_hints.
Tip
Возможно, вам потребуется задать или очистить подсказки для всех query_id
значений, соответствующих хэшу запроса.
dbo.sp_query_store_modify_hints_by_query_hash является примером хранимой процедуры, которая вызывает в цикле хранимую процедуру sys.sp_query_store_set_hints
или системную хранимую процедуру sys.sp_query_store_clear_hints
для выполнения этого.
Атрибуты XML плана выполнения
При применении подсказок следующий результирующий набор отображается в StmtSimple
элементе плана выполнения в формате XML:
Attribute | Description |
---|---|
QueryStoreStatementHintText |
Текущие подсказки хранилища запросов, примененные к запросу |
QueryStoreStatementHintId |
Уникальный идентификатор указания запроса |
QueryStoreStatementHintSource |
Источник указания хранилища запросов (например, User ) |
Note
Эти XML-элементы доступны через выходные данные команд Transact-SQL SET STATISTICS XML и SET SHOWPLAN_XML.
Подсказки для хранилища запросов и совместимость функций
- Подсказки хранилища запросов имеют приоритет над другими подсказками на уровне жестко заданных инструкций и планов.
- За исключением подсказки
ABORT_QUERY_EXECUTION
, запросы с подсказками хранилища запросов всегда выполняются. Противоречивые подсказки Query Store игнорируются, если они могли бы вызвать ошибку. - Если подсказки хранилища запросов противоречат, ядро СУБД не блокирует выполнение запросов, а указание хранилища запросов не применяется.
- Указания хранилища запросов не поддерживаются для инструкций, которые соответствуют простой параметризации.
- Указание
RECOMPILE
несовместимо с принудительной параметризацией на уровне базы данных. Если база данных имеет набор принудительной параметризации, аRECOMPILE
указание является частью подсказок хранилища запросов для запроса, ядро СУБД игнорируетRECOMPILE
указание и применяет любые другие указания, если они указаны.- Ядро СУБД выдает предупреждение (код ошибки 12461), указывающее, что
RECOMPILE
указание было проигнорировано. - Дополнительные сведения о вариантах использования принудительной параметризации см. в рекомендациях по использованию принудительной параметризации.
- Ядро СУБД выдает предупреждение (код ошибки 12461), указывающее, что
- Указания хранилища запросов, созданные вручную, не подлежат очистке хранилища запросов. Указание и запрос не удаляются политикой автоматического управления сохранением данных.
- Запросы можно удалить вручную пользователями. Это также удаляет связанную подсказку хранилища запросов.
- Подсказки Хранилища Запросов, автоматически генерируемые Обратной связью CE, подлежат очистке в соответствии с автоматическим хранением политики захвата.
- Обратная связь по DOP и обратная связь по выделению памяти формируют поведение запроса без использования подсказок Query Store. При очистке запросов политикой автоматического управления хранением данные отзывов DOP и предоставления памяти также удаляются.
- Если вы создаёте ту же подсказку хранилища запросов, что и отзыв о компиляции запросов CE, реализованный вручную, запрос с этой подсказкой больше не подлежит очистке политикой автоматического захвата сохранения.
Подсказки хранилища запросов и вторичные реплики
Подсказки хранилища запросов не оказывают влияния на вторичные реплики, если хранилище запросов для них не активировано. Дополнительные сведения см. в разделе "Хранилище запросов" для доступных для чтения вторичных файлов.
- В SQL Server 2022 (16.x) и более ранних версиях подсказки хранилища запросов можно применять только на первичной реплике.
- В SQL Server 2022 (16.x) и более поздних версиях при включении хранилища запросов для вторичных реплик подсказки хранилища запросов могут применяться к вторичным репликам в группах доступности.
- Вы можете добавить подсказку хранилища запросов, чтобы она действовала только в определенной группе реплик, если у вас включено хранилище запросов для вторичных реплик. Для этого используйте параметр
@replica_group_id
при вызове sys.sp_query_store_set_query_hints. С другой стороны, можно удалить подсказку для хранилища запросов из определенной группы реплик с помощью sys.sp_query_store_clear_query_hints. - Найдите доступные группы реплик, запрашивая sys.query_store_replicas.
- Найдите планы на вторичных репликах, которые были принудительно установлены, с помощью sys.query_store_plan_forcing_locations.
Examples
A. Демонстрация подсказок хранилища запросов
В следующем пошаговом руководстве по хранилищу запросов в Базе данных SQL Azure используется импортированная база данных через BACPAC-файл (.bacpac
). Узнайте, как импортировать новую базу данных в сервер Azure SQL Database, см. Краткое руководство: Импорт bacpac-файла в базу данных Azure SQL Database или в Управляемом экземпляре Azure SQL.
-- ************************************************************************ --
-- Query Store hints demo
-- Demo uses "PropertyMLS" database which can be imported from BACPAC here:
-- https://github.com/microsoft/sql-server-samples/tree/master/samples/features/query-store
-- Email [email protected] for questions\feedback
-- ************************************************************************ --
/*
Demo prep, connect to the PropertyMLS database
*/
ALTER DATABASE [PropertyMLS] SET QUERY_STORE CLEAR;
ALTER DATABASE CURRENT SET QUERY_STORE = ON;
ALTER DATABASE CURRENT SET QUERY_STORE (QUERY_CAPTURE_MODE = ALL);
GO
-- Should be READ_WRITE
SELECT actual_state_desc
FROM sys.database_query_store_options;
GO
/*
You can verify Query Store Hints in sys.query_store_query_hints.
Checking if any already exist (should be none).
*/
SELECT query_hint_id,
query_id,
query_hint_text,
last_query_hint_failure_reason,
last_query_hint_failure_reason_desc,
query_hint_failure_count,
source,
source_desc
FROM sys.query_store_query_hints;
GO
/*
The PropertySearchByAgent stored procedure has a parameter
used to filter AgentId. Looking at the statistics for AgentId,
you will see that there is a big skew for AgentId 101.
*/
SELECT hist.range_high_key AS [AgentId],
hist.equal_rows
FROM sys.stats AS s
CROSS APPLY sys.dm_db_stats_histogram(s.[object_id], s.stats_id) AS hist
WHERE s.[name] = N'NCI_Property_AgentId';
-- Show actual query execution plan to see plan compiled.
-- Agent with many properties will have a scan with parallelism.
EXEC [dbo].[PropertySearchByAgent] 101;
-- Agents with few properties still re-use this plan (assuming no recent plan eviction).
EXEC [dbo].[PropertySearchByAgent] 4;
/*
Now let's find the query_id associated with this query.
*/
SELECT query_sql_text, q.query_id
FROM sys.query_store_query_text qt
INNER JOIN sys.query_store_query q ON
qt.query_text_id = q.query_text_id
WHERE query_sql_text like N'%ORDER BY ListingPrice DESC%' and query_sql_text not like N'%query_store%';
GO
/*
We can set the hint associated with the query_id returned in the previous result set, as below.
Note, we can designate one or more query hints
*/
EXEC sp_query_store_set_hints @query_id=5, @value = N'OPTION(RECOMPILE)';
GO
/*
You can verify Query Store Hints in sys.query_store_query_hints
*/
SELECT query_hint_id,
query_id,
query_hint_text,
last_query_hint_failure_reason,
last_query_hint_failure_reason_desc,
query_hint_failure_count,
source,
source_desc
FROM sys.query_store_query_hints;
GO
-- Execute both at the same time and show actual query execution plan.
-- You should see two different plans, one for AgentId 101 and one for AgentId 4.
EXEC [dbo].[PropertySearchByAgent] 101;
EXEC [dbo].[PropertySearchByAgent] 4;
GO
SELECT query_hint_id,
query_id,
query_hint_text,
last_query_hint_failure_reason,
last_query_hint_failure_reason_desc,
query_hint_failure_count,
source,
source_desc
FROM sys.query_store_query_hints;
GO
/*
We can remove the hint using sp_query_store_clear_query_hints
*/
EXEC sp_query_store_clear_hints @query_id = 10;
GO
/*
That Query Store Hint is now removed
*/
SELECT query_hint_id,
query_id,
query_hint_text,
last_query_hint_failure_reason,
last_query_hint_failure_reason_desc,
query_hint_failure_count,
source,
source_desc
FROM sys.query_store_query_hints;
GO
-- Execute both at the same time and show actual query execution plan.
-- You should see one plan again.
EXEC [dbo].[PropertySearchByAgent] 101;
EXEC [dbo].[PropertySearchByAgent] 4;
GO
B. Идентифицировать запрос в хранилище запросов
В следующем примере выполняется запрос к sys.query_store_query_text и sys.query_store_query, чтобы получить query_id
для текстового фрагмента выполненного запроса:
В этой демонстрации запрос, который мы пытаемся настроить, находится в образце базы данных SalesLT
:
SELECT * FROM SalesLT.Address as A
INNER JOIN SalesLT.CustomerAddress as CA
on A.AddressID = CA.AddressID
WHERE PostalCode = '98052' ORDER BY A.ModifiedDate DESC;
Хранилище запросов не сразу отображает данные запросов в системных представлениях.
Определите запрос в представлениях системного каталога «Хранилище запросов»:
SELECT q.query_id, qt.query_sql_text
FROM sys.query_store_query_text qt
INNER JOIN sys.query_store_query q ON
qt.query_text_id = q.query_text_id
WHERE query_sql_text like N'%PostalCode =%'
AND query_sql_text not like N'%query_store%';
GO
В следующих примерах запрос из предыдущего примера в базе данных SalesLT
обозначен как query_id
39.
Определив указание, примените его для принудительного выделения максимального размера памяти в процентах от заданного предела памяти для query_id
:
EXEC sys.sp_query_store_set_hints @query_id= 39, @query_hints = N'OPTION(MAX_GRANT_PERCENT=10)';
Кроме того, указания запросов можно применять с помощью следующего синтаксиса (например, с параметром для принудительного использования устаревшего оценщика кратности):
EXEC sys.sp_query_store_set_hints @query_id= 39, @query_hints = N'OPTION(USE HINT(''FORCE_LEGACY_CARDINALITY_ESTIMATION''))';
Можно применять несколько указаний запроса в виде списка с разделителями-запятыми:
EXEC sys.sp_query_store_set_hints @query_id= 39, @query_hints = N'OPTION(RECOMPILE, MAXDOP 1, USE HINT(''QUERY_OPTIMIZER_COMPATIBILITY_LEVEL_110''))';
Просмотрите подсказку Query Store, примененную для query_id
39:
SELECT query_hint_id, query_id, query_hint_text, last_query_hint_failure_reason, last_query_hint_failure_reason_desc, query_hint_failure_count, source, source_desc
FROM sys.query_store_query_hints
WHERE query_id = 39;
Наконец, удалите указание из query_id
39 с помощью инструкции sp_query_store_clear_hints.
EXEC sys.sp_query_store_clear_hints @query_id = 39;
Related content
- sys.query_store_query_hints (Transact-SQL)
- sys.sp_query_store_set_hints (Transact-SQL)
- sys.sp_query_store_clear_hints (Transact-SQL)
- Сохранение плана выполнения в формате XML
- Отображение и сохранение планов выполнения
- Подсказки запросов (Transact-SQL)
- Лучшие практики по мониторингу рабочих нагрузок с помощью Хранилища запросов
- Лучшие практики использования подсказок для Хранилища запросов
- Мониторинг производительности с использованием хранилища запросов
- Настройка максимальной степени параллелизма (MAXDOP) в Базе данных SQL Azure