クエリ ヒントについて
クエリ ヒントは、 SELECT、 INSERT、 UPDATE、または DELETE ステートメントの実行プランで特定の演算子を使用するようにクエリ プロセッサを強制するために適用できるオプションまたは戦略です。 クエリ ヒントは、 OPTION 句を使用して、クエリ プロセッサが特定のクエリに対して選択する可能性がある実行プランをオーバーライドします。
ほとんどの場合、クエリ オプティマイザーは、インデックス、統計、およびデータ分散に基づいて効率的な実行プランを選択します。 データベース管理者が手動で介入する必要はほとんどありません。
クエリの最後にクエリ ヒントを追加することで、クエリの実行プランを変更できます。 たとえば、1 つの CPU を使用するクエリの末尾に OPTION (MAXDOP <integer_value>) を追加した場合、クエリでは、選択した値に応じて複数の CPU (並列処理) が使用される場合があります。 または、 OPTION (RECOMPILE) を使用して、クエリが実行されるたびに新しい一時的なプランを確実に生成することもできます。
--With maxdop hint
SELECT ProductID, OrderQty, SUM(LineTotal) AS Total
FROM Sales.SalesOrderDetail
WHERE UnitPrice < $5.00
GROUP BY ProductID, OrderQty
ORDER BY ProductID, OrderQty
OPTION (MAXDOP 2)
GO
--With recompile hint
SELECT City
FROM Person.Address
WHERE StateProvinceID=15 OPTION (RECOMPILE)
GO
クエリ ヒントは、さまざまなパフォーマンス関連の問題にローカライズされたソリューションを提供する場合がありますが、次の理由で運用環境で使用しないようにする必要があります。
- クエリに永続的なクエリ ヒントがあると、構造データベースの変更が発生し、そのクエリが適用されないことに役立つ可能性があります。
- クエリを特定の実行プランにバインドする場合、以降のバージョンの SQL Server の新機能や改善された機能の恩恵を受けることはできません。
ただし、SQL Server には、さまざまな目的で使用できるクエリ ヒントがいくつかあります。 それらのいくつかについて、以下で説明します。
FAST <integer_value>— クエリの実行を継続しながら、最初の <integer_value> 行数を取得します。 高速クエリ ヒントでは、小さなデータ セットと低い値の方が適しています。 行数が増えるにつれて、クエリ コストが高くなります。OPTIMIZE FOR— クエリをコンパイルして最適化するときに、ローカル変数の特定の値を使用する必要があることをクエリ オプティマイザーに指示します。USE PLAN—クエリ オプティマイザーは、 xml_plan 属性で指定されたクエリ プランを使用します。RECOMPILE— クエリの新しい一時的なプランを作成し、クエリの実行直後に破棄します。{ LOOP | MERGE | HASH } JOIN—クエリ全体でLOOP JOIN、MERGE JOIN、またはHASH JOINによって実行されるすべての結合操作を指定します。 複数の結合ヒントを指定した場合、オプティマイザーはオプションの中から最もコストの低い結合戦略を選択します。MAXDOP <integer_value>—sp_configureの並列処理の最大値をオーバーライドします。 このオプションを指定するクエリによって、リソース ガバナーもオーバーライドされます。
同じクエリに複数のクエリ ヒントを適用することもできます。 次の例では、同じクエリで HASH GROUP と FAST <integer_value> クエリ ヒントを使用します。
SELECT ProductID, OrderQty, SUM(LineTotal) AS Total
FROM Sales.SalesOrderDetail
WHERE UnitPrice < $5.00
GROUP BY ProductID, OrderQty
ORDER BY ProductID, OrderQty
OPTION (HASH GROUP, FAST 10);
GO
クエリ ヒントの詳細については、「 ヒント (Transact-SQL)」を参照してください。
クエリ ストアのヒント
クエリ ストア ヒント は、アプリケーション コードを変更せずにクエリ プランを整形するための簡単な方法を提供します。
クエリ ストア ヒントは、クエリ オプティマイザーで効率的な実行プランが生成されない場合や、開発者または DBA が元のクエリ テキストを変更できない場合に便利です。 一部のアプリケーションでは、クエリ テキストがハードコードされたり、自動的に生成されたりすることがあります。
クエリ ストア ヒントを使用するには、クエリ ストア カタログ ビュー、組み込みのクエリ ストア レポート、または Azure SQL Database の Query Performance Insight を使用して、変更するクエリ ステートメントのクエリ ストアの query_id を特定する必要があります。 次に、クエリに適用するsp_query_store_set_hintsとクエリ ヒント文字列を使用してを実行します。
次の例は、特定のクエリの query_id を取得し、それを使用して RECOMPILE と MAXDOP のヒントをクエリに適用する方法を示しています。
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'%ORDER BY CustomerName DESC%'
AND query_sql_text not like N'%query_store%'
GO
--Assuming the query_id returned by the previous query is 42
EXEC sys.sp_query_store_set_hints @query_id= 42, @query_hints = N'OPTION(RECOMPILE, MAXDOP 1)'
GO
クエリ ストア ヒントがクエリ レベルのパフォーマンスの問題に役立つシナリオがいくつかあります。
- 実行ごとにクエリを再コンパイルする。
- 統計更新操作の並列処理の最大限度を制限します。
- ネステッド ループ結合ではなく、ハッシュ結合を使用する。
- データベースを現在の互換性に保ちながら、特定のクエリに互換性レベル 110 を使用します。
クエリ ストア ヒントの詳細については、「 クエリ ストア ヒント」を参照してください。