sp_query_store_set_hints (Transact-SQL)

適用対象: SQL Server 2022 (16.x) Azure SQL DatabaseAzure SQL Managed Instance

特定の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 = ] query_id

sys.query_store_queryのクエリ ストアquery_id列。 @query_idbigint です

[ @query_hints = ] N'query_hints'

で始まる 'OPTIONクエリ オプションの文字列。 @query_hintsnvarchar(max)です。 詳細については、この記事の 「サポートされているクエリ ヒント 」を参照してください。

[ @query_hint_scope = ] 'replica_group_id'

既定では、新しいクエリ ストア ヒントのスコープはローカル レプリカのみです。 @query_hint_scopetinyint です。 この省略可能なパラメーターは、セカンダリ レプリカのクエリ ストアが有効になっているときに、セカンダリ レプリカにヒントを適用するスコープを決定します。 省略可能な query_hint_scope 引数の既定値はローカル レプリカ (プライマリまたはセカンダリ) のみですが、必要に応じて、sys.query_store_replicasを参照するreplica_group_idを指定できます。

戻り値

0 (成功) または 1 (失敗)。

解説

ヒントは、有効な 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''))';

複数のヒントを適用する

次の例では、RECOMPILE、MAXDOP 1、SQL 2012 クエリ オプティマイザーの動作など、複数のクエリ ヒントを query_id 39 に適用します。

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;

クエリからヒントを削除する

sp_query_store_clear_hints (Transact-SQL) システム ストアド プロシージャ使用して、query_id 39 からヒントを削除するには、次の例を使用します。

EXEC sys.sp_query_store_clear_hints @query_id = 39;

次の手順