Partage via


sys.sp_query_store_set_hints (Transact-SQL)

S’applique à : SQL Server 2022 (16.x)base de données Azure SQLAzure SQL Managed Instance

Crée ou met à jour des indicateurs Magasin des requêtes pour une query_id donnée.

Conventions de la syntaxe Transact-SQL

Syntaxe

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

Arguments

Important

Les arguments des procédures stockées étendues doivent être entrés dans l’ordre spécifique, comme décrit dans la section syntaxe. Si les paramètres sont entrés hors ordre, un message d’erreur se produit.

[ @query_id = ] query_id

Colonne Magasin des requêtes query_id de sys.query_store_query. @query_id est bigint.

[ @query_hints = ] N’query_hints'

Chaîne de caractères d’options de requête commençant par OPTION. @query_hints est nvarchar(max). Pour plus d’informations, consultez les indicateurs de requête pris en charge dans cet article.

[ @query_hint_scope = ] 'replica_group_id'

Par défaut, l’étendue d’un nouvel indicateur de Magasin des requêtes est le réplica local uniquement. @query_hint_scope est minuscule. Ce paramètre facultatif détermine l’étendue à laquelle l’indicateur sera appliqué sur un réplica secondaire lorsque Magasin des requêtes pour les réplicas secondaires est activé. L’argument query_hint_scope facultatif est défini par défaut uniquement sur le réplica local (principal ou secondaire), mais vous pouvez éventuellement spécifier une replica_group_id référençant sys.query_store_replicas.

Valeur retournée

0 (réussite) or 1 (échec).

Notes

Les conseils sont spécifiés au format de chaîne valide T-SQL N'OPTION (..)'.

  • Si aucun indicateur du Magasin des requêtes n’existe pour une @query_idspécifique, un nouvel indicateur du Magasin des requêtes est créé.
  • Si un indicateur du Magasin des requêtes existe déjà pour un @query_idspécifique, la valeur spécifiée pour @query_hints remplace les indicateurs précédemment spécifiés pour la requête associée.
  • Si un query_id n’existe pas, une erreur est générée.

Dans le cas où l’un des indicateurs empêcherait la production d’un plan de requête, tous les indicateurs sont ignorés. Pour plus d’informations sur les détails de l’échec, consultez sys.query_store_query_hints.

Pour supprimer des indicateurs associés à un query_id, utilisez la procédure stockée système sys.sp_query_store_clear_hints.

Indicateurs de requête pris en charge

Ces indicateurs de requête sont pris en charge en tant qu conseils du Magasin des requêtes :

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

Actuellement, les indicateurs de requête suivants ne sont pas pris en charge :

autorisations

Exige l’autorisation ALTER sur la base de données.

Exemples

Identifier une requête dans le Magasin des requêtes

L’exemple suivant interroge sys.query_store_query_text et sys.query_store_query pour renvoyer le query_id pour un fragment de texte de requête exécuté.

Dans cet exemple, la requête que nous essayons d’ajuster se trouve dans l’exemple de base de données 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;

Le Magasin des requêtes ne reflète pas immédiatement les données de requête à ses affichages système.

Identifiez la requête dans les vues de catalogue système du Magasin des requêtes :

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

Dans les exemples suivants, l’exemple de requête précédent dans la SalesLT base de données a été identifié comme query_id 39.

Appliquer un conseil unique

L’exemple suivant applique l’indicateur RECOMPILE à query_id 39, comme identifié dans Magasin des requêtes :

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

L’exemple suivant applique l’indicateur pour forcer l’estimateur de cardinalité héritée à query_id 39, identifié dans Magasin des requêtes :

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

Appliquer plusieurs conseils

L’exemple suivant applique plusieurs indicateurs de requête à query_id 39, notamment RECOMPILE, MAXDOP 1 et le comportement de l’optimiseur de requête 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''))';

Afficher les conseils du Magasin des requêtes

L’exemple suivant retourne les indicateurs du Magasin des requêtes existants:

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;

Supprimer le conseil d’une requête

Utilisez l’exemple suivant pour supprimer l’indicateur de query_id 39, à l’aide de la procédure stockée système sp_query_store_clear_hints.

EXEC sys.sp_query_store_clear_hints @query_id = 39;