Поделиться через


sys.sp_query_store_set_hints (Transact-SQL)

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

Создает или обновляет хранилище запросов подсказки для заданного query_id.

Соглашения о синтаксисе Transact-SQL

Syntax

sp_query_store_set_hints
    [ @query_id = ] query_id ,
    [ @query_hints = ] 'query_hints'
    [ , [ @replica_group_id = ] 'replica_group_id' ]
[ ; ]

Arguments

Important

Аргументы для расширенных хранимых процедур необходимо ввести в определенном порядке, как описано в разделе Синтаксис. Если параметры введены вне порядка, возникает сообщение об ошибке.

[ @query_id = ] query_id

Столбец хранилище запросов query_id из sys.query_store_query.

@query_id является bigint.

[ @query_hints = ] N'query_hints'

Символьная строка параметров запроса, начиная с OPTION. @query_hints — nvarchar(max).

При USE HINT включении в @query_hints аргумент одинарные кавычки вокруг отдельных имен подсказок должны повторяться. Например: @query_hints = N'OPTION (MAXDOP = 1, USE HINTS (''ENABLE_QUERY_OPTIMIZER_HOTFIXES'',''QUERY_OPTIMIZER_COMPATIBILITY_LEVEL_150''))'.

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

[ @replica_group_id = ] 'replica_group_id'

Этот необязательный параметр определяет область применения указания на вторичной реплике при включении хранилища запросов для доступных для чтения вторичных файлов . @replica_group_id является bigint.

Аргумент @replica_group_id по умолчанию использует локальную реплику (первичную или вторичную), но при необходимости можно указать значение, соответствующее значению в replica_group_id столбце в sys.query_store_replicas , чтобы задать указание для другой группы реплик.

Return value

0 (успешно) или 1 (сбой).

Remarks

Указания задаются в допустимом строковом формате T-SQL N'OPTION (..)'.

  • Если для определенного @query_idнет подсказок хранилища запросов, создается новое указание хранилища запросов.
  • Если указание хранилища запросов уже существует для определенного @query_id, значение, указанное для @query_hints заменяет ранее указанные указания для связанного запроса.
  • Если 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)

Permissions

Требуется разрешение ALTER для базы данных.

Examples

Определение запроса в хранилище запросов

В следующем примере запросы 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 AS qt
     INNER JOIN sys.query_store_query AS 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, как указано в хранилище запросов:

EXECUTE sys.sp_query_store_set_hints
    @query_id = 39,
    @query_hints = N'OPTION(RECOMPILE)';

В следующем примере применяется указание для принудительного определения кратности прежних версий query_id 39, определенных в хранилище запросов:

EXECUTE sys.sp_query_store_set_hints
    @query_id = 39,
    @query_hints = N'OPTION(USE HINT(''FORCE_LEGACY_CARDINALITY_ESTIMATION''))';

Применение нескольких указаний

В следующем примере несколько подсказок запроса применяются к query_id 39, включая RECOMPILEMAXDOP 1и поведение оптимизатора запросов на уровне совместимости 110:

EXECUTE 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,
       replica_group_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 .

EXECUTE sys.sp_query_store_clear_hints @query_id = 39;