クエリ ヒントについて理解する

完了

クエリ ヒントは、SELECTINSERTUPDATE、または 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> 数を取得します。 これは、データセットが小さく FAST クエリ ヒントの値が小さい場合に効果があります。 行数が増えるにつれて、クエリ コストが高くなります。

  • OPTIMIZE FOR - クエリのコンパイルと最適化時に、クエリ オプティマイザーに対して、ローカル変数の特定の値を使用する必要があることを指示します。

  • USE PLAN - クエリ オプティマイザーは、xml_plan 属性で指定されたクエリ プランを使用します。

  • RECOMPILE - そのクエリのための新しい一時プランを作成し、クエリの実行直後にそのプランを破棄します。

  • { LOOP | MERGE | HASH } JOIN - クエリ全体ですべての結合操作が LOOP JOINMERGE JOIN、または HASH JOIN によって実行されるように指定します。 複数の結合ヒントを指定する場合、オプティマイザーはオプションの中から最もコストの低い結合戦略を選択します。

  • MAXDOP <integer_value> - sp_configure の並列処理の最大値をオーバーライドします。 このオプションを指定するクエリによって、Resource Governor もオーバーライドされます。

同じクエリに複数のクエリ ヒントを適用することもできます。 次の例では、同じクエリで 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) に関する記事を参照してください。

クエリ ストア ヒント (プレビュー)

Azure SQL Database のクエリ ストア ヒント機能は、アプリケーション コードを変更することなく、クエリ プランを簡単に整形できる方法を提供します。

クエリ ストア ヒントは、クエリ オプティマイザーで効率的な実行プランが生成されない場合や、開発者または DBA が元のクエリ テキストを変更できない場合に便利です。 一部のアプリケーションでは、クエリ テキストがハードコーディングされたり、自動的に生成されたりすることがあります。

Screenshot of how Query Store hints work.

クエリ ストア ヒントを使用するには、クエリ ストア カタログ ビュー、組み込みのクエリ ストア レポート、または Azure SQL Database の Query Performance Insight を使用して、変更したいクエリ ステートメントのクエリ ストア query_id を特定する必要があります。 その後、そのクエリに適用したい 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 を使用する。

Note

クエリ ストア ヒントは、SQL Managed Instance でもサポートされています。

クエリ ストア ヒントの詳細については、「クエリ ストア ヒント」を参照してください。