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 ] )

Следующие указания запросов на данный момент не поддерживаются:

Разрешения

Необходимо разрешение 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;

Дальнейшие действия