適用対象: Sql Server 2022 (16.x) 以降のバージョン
Azure SQL Database
Azure SQL Managed Instance
SQL データベース
特定のquery_idのヒントクエリ ストア作成または更新します。
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 は 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 です。 セカンダリレプリカ用のクエリストアはSQL Server 2025(17.x)以降のバージョンおよびAzure SQL Databaseからサポートされています。 完全なプラットフォームサポートについては、 二次レプリカについてはクエリストアを参照してください。
@replica_group_id引数の既定値はローカル レプリカ (プライマリまたはセカンダリ) ですが、必要に応じて、sys.query_store_replicasの replica_group_id 列の値と一致する値を指定して、別のレプリカ グループのヒントを設定できます。
戻り値
0 (成功) または 1 (失敗)。
Remarks
ヒントは、有効な T-SQL 文字列形式 N'OPTION (..)' で指定されます。
- 特定の @query_idのクエリ ストア ヒントが存在しない場合は、新しいクエリ ストア ヒントが作成されます。
- 特定の @query_idに対してクエリ ストア ヒントが既に存在する場合は、 @query_hints に指定された値によって、関連付けられたクエリに対して以前に指定したヒントが置き換えられます。
- query_idが存在しない場合は、エラーが発生します。
ヒントの 1 つがクエリ プランの生成を妨げる場合、すべてのヒントは無視されます。 エラーの詳細については、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_TVDISABLE_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)';
次の例では、ヒントを適用して、クエリ ストアで識別される legacy カーディナリティ推定を query_id 39 に強制します。
EXECUTE sys.sp_query_store_set_hints
@query_id = 39,
@query_hints = N'OPTION(USE HINT(''FORCE_LEGACY_CARDINALITY_ESTIMATION''))';
複数のヒントを適用する
次の例では、互換性レベル 110 、RECOMPILE、クエリ オプティマイザーの動作など、複数のクエリ ヒントを query_id 39 に適用します。
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;
クエリからヒントを削除する
sp_query_store_clear_hints システム ストアド プロシージャを使用して、query_id 39 からヒントを削除するには、次の例を使用します。
EXECUTE sys.sp_query_store_clear_hints @query_id = 39;