sys.sp_query_store_set_hints (Transact-SQL)
適用対象: SQL Server 2022 (16.x) Azure SQL データベース Azure SQL Managed Instance
特定のquery_idのヒントクエリ ストア作成または更新します。
構文
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_id は bigint です。
[ @query_hints = ] N'query_hints'
OPTION
で始まるクエリ オプションの文字列。 @query_hints は nvarchar(max)です。 詳細については、この記事の サポートされているクエリ ヒント を参照してください。
[ @query_hint_scope = ] 'replica_group_id'
既定では、新しいクエリ ストア ヒントのスコープはローカル レプリカのみです。 @query_hint_scope は tinyint です。 この省略可能なパラメーターは、セカンダリ レプリカのクエリ ストアが有効になっているときにヒントをセカンダリ レプリカに適用するスコープ決定します。 省略可能な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 ] )
現在、次のクエリ ヒントはサポートされていません。
OPTIMIZE FOR ( @var = val)
MAXRECURSION
USE PLAN
(代わりに、クエリ ストアの元のプラン強制機能 (sp_query_store_force_plan) を検討してください)。DISABLE_DEFERRED_COMPILATION_TV
DISABLE_TSQL_SCALAR_UDF_INLINING
- テーブル ヒント (例: FORCESEEK、READUNCOMMITTED、INDEX)
アクセス許可
データベースに対する 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)';
次の例では、ヒントを適用して、クエリ ストアで識別される legacy カーディナリティ推定を 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 システム ストアド プロシージャを使用して、query_id 39 からヒントを削除するには、次の例を使用します。
EXEC sys.sp_query_store_clear_hints @query_id = 39;