sp_query_store_set_hints (Transact-SQL)
Применимо к:база данных
Azure SQL SQL Server 2022 (16.x
Управляемый экземпляр SQL Azure
Создает или обновляет Указания хранилища запросов для данного запроса query_id
.
Соглашения о синтаксисе Transact-SQL
Синтаксис
sp_query_store_set_hints
@query_id = 'query_id',
@query_hints = 'query_hints'
[, @query_hint_scope = 'replica_group_id' ] [;]
Аргументы
@query_id
Bigint. Обязательный. Хранилище запросов query_id
из sys.query_store_query.
@query_hints
Nvarchar(max). Строка параметров запроса, начинающаяся с 'OPTION
. Дополнительные сведения см. в разделе Поддерживаемые указания запросов в этой статье.
[ @query_hint_scope ]
Tinyint. По умолчанию областью нового указания хранилище запросов является только локальная реплика. Этот необязательный параметр определяет область, в которой указание будет применяться к вторичной реплике при включении хранилище запросов для вторичных реплик. Необязательный аргумент query_hint_scope по умолчанию использует только локальную реплику (первичную replica_group_id
или вторичную), но при необходимости можно указать ссылающийся sys.query_store_replicas.
Возвращаемые значения
0 (успешное завершение) или 1 (неуспешное завершение)
Remarks
Указания задаются в допустимом строковом формате T-SQL N'OPTION (..)'
.
- Если для определенного
query_id
не существует указания хранилища запросов, будет создано новое. - Если указание хранилища запросов уже существует для определенного
query_id
, последнее представленное значение переопределит ранее указанные значения для соответствующего запроса. - Если
query_id
не существует, возникнет ошибка.
Если указание приведет к сбою запроса, оно игнорируется, а актуальные сведения о сбоях можно просмотреть в sys.query_store_query_hints.
Чтобы удалить указания, связанные с query_id
, используйте системную хранимую процедуру sys.sp_query_store_clear_hints.
Поддерживаемые указания запросов
Эти указания запроса поддерживаются в виде указаний хранилища запросов:
{ HASH | ORDER } GROUP
| { CONCAT | HASH | MERGE } UNION
| { LOOP | MERGE | HASH } JOIN
| EXPAND VIEWS
| FAST number_rows
| FORCE ORDER
| IGNORE_NONCLUSTERED_COLUMNSTORE_INDEX
| KEEP PLAN
| KEEPFIXED PLAN
| MAX_GRANT_PERCENT = percent
| MIN_GRANT_PERCENT = percent
| MAXDOP number_of_processors
| NO_PERFORMANCE_SPOOL
| OPTIMIZE FOR UNKNOWN
| PARAMETERIZATION { SIMPLE | FORCED }
| RECOMPILE
| ROBUST PLAN
| USE HINT ( '<hint_name>' [ , ...n ] )
Следующие указания запросов на данный момент не поддерживаются:
- OPTIMIZE FOR(@var = val)
- MAXRECURSION
- USE PLAN (вместо этого рассмотрите возможность принудительного применения первоначального плана хранилища запросов , sp_query_store_force_plan).
- DISABLE_DEFERRED_COMPILATION_TV
- DISABLE_TSQL_SCALAR_UDF_INLINING
- Табличные указания (например, FORCESEEK, READUNCOMMITTED, INDEX)
Разрешения
Необходимо разрешение ALTER для базы данных.
Примеры
Определение запроса в хранилище запросов
В следующем примере выполняется запрос к 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.
Применение одного указания
В следующем примере применяется указание RECOMPILE к запросу query_id
39, обнаруженному в хранилище запросов:
EXEC sys.sp_query_store_set_hints @query_id= 39, @query_hints = N'OPTION(RECOMPILE)';
В следующем примере применяется указание для принудительного использования устаревшего оценщика количества элементов к запросуquery_id
39, обнаруженного в хранилище запросов:
EXEC sys.sp_query_store_set_hints @query_id= 39, @query_hints = N'OPTION(USE HINT(''FORCE_LEGACY_CARDINALITY_ESTIMATION''))';
Применение нескольких указаний
В следующем примере несколько указаний запроса применяются к запросу query_id
39, включая RECOMPILE, MAXDOP 1 и поведение оптимизатора запросов SQL 2012:
EXEC sys.sp_query_store_set_hints @query_id= 39, @query_hints = N'OPTION(RECOMPILE, MAXDOP 1, USE HINT(''QUERY_OPTIMIZER_COMPATIBILITY_LEVEL_110''))';
Просмотр указаний хранилища запросов
В следующем примере возвращаются существующие указания хранилища запросов:
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 (Transact-SQL).
EXEC sys.sp_query_store_clear_hints @query_id = 39;