クエリ ストア ヒントのベスト プラクティス

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

この記事では、クエリ ストア ヒント を使用する場合のベスト プラクティスについて詳しく説明します。 クエリ ストア ヒントを使用すると、アプリケーション コードを変更することなくクエリ プランを形成できます。

クエリ ストア ヒントのユース ケース

次のユース ケースをクエリ ストア ヒントの理想と考えてください。 詳細については、「いつクエリ ストア ヒントを使用するか」を参照してください。

注意

通常、クエリにとって最適な実行プランが SQL Server クエリ オプティマイザーによって選択されるため、ヒントは、経験を積んだ開発者やデータベース管理者が最後の手段としてのみ使用することをお勧めします。 詳細については、「クエリ ヒント」を参照してください。

コードを変更できない場合

クエリ ストア ヒントを使用すると、アプリケーション コードやデータベース オブジェクトを変更することなく、クエリの実行プランに影響を与えることができます。 クエリ ヒントをすばやく簡単に適用できる他の機能はありません。

たとえば、クエリ ストア ヒントを使用すると、コードを再配置せずに ETL を利用できます。 この 14 分間のビデオでは、クエリ ストア ヒントを使用して一括読み込みを改善する方法について説明しています。

クエリ ストア ヒントは軽量なクエリ チューニング方法ですが、クエリに問題が発生した場合は、より大幅なコード変更による対処が必要になります。 クエリにクエリ ストア ヒントを適用することが常に必要になっている場合は、より大規模なクエリの書き換えを検討してください。 通常、クエリにとって最適な実行プランが SQL Server クエリ オプティマイザーによって選択されるため、ヒントは、経験を積んだ開発者やデータベース管理者が最後の手段としてのみ使用することをお勧めします。

どのクエリ ヒントを適用できるかについては、「サポートされているクエリ ヒント」を参照してください。

トランザクション負荷が高い場合、またはミッション クリティカルなコードを使用する場合

アップタイム要件やトランザクション負荷が高いためにコードの変更が実用的でない場合、クエリ ストア ヒントを使用すると、既存のクエリ ワークロードにクエリ ヒントをすばやく適用できます。 クエリ ストア ヒントの追加と削除は簡単です。

クエリ ストア ヒントは、クエリのバッチに対して追加と削除を行い、例外的なワークロードのバーストに対する時間枠のパフォーマンスを調整できます。

プラン ガイドの代わりとして

クエリ ストア ヒント以前には、開発者は同様のタスクを実行するためにプラン ガイドに依存しなければなりませんでしたが、それは複雑で使いづらいことがありました。 クエリ ストア ヒントは、クエリを視覚的に探索するために、SQL Server Management Studio (SSMS) のクエリ ストア機能と統合されています。

プラン ガイドでは、クエリ スニペットを使用してすべてのプランを検索する必要があります。 クエリ ストア ヒント機能では、結果のクエリ プランに影響を与えるために正確に一致するクエリは必要ありません。 クエリ ストア ヒントは、クエリ ストア データセット内の query_id に適用できます。

クエリ ストア ヒントは、ハードコーディングされたステートメント レベルのヒントと既存のプラン ガイドをオーバーライドします。

新しい互換性レベルを検討する

クエリ ストア ヒントは、たとえばベンダーの仕様やテストの遅延が大きいなどの理由で、新しいデータベース互換性レベルを使用できない場合に価値のある方法になります。 より高い互換性レベルをデータベースで使用できる場合は、個人のクエリのデータベースの互換性レベルをアップグレードして、SQL Server の最新のパフォーマンス最適化と機能を活用することを検討してください。

たとえば、互換性レベル 140 のデータベースを持つ SQL Server 2022 (16.x) インスタンスがある場合でも、クエリ ストア ヒントを使用して、互換性レベル 160 で個々のクエリを実行できます。 次のヒントを使用できます。

EXEC sys.sp_query_store_set_hints @query_id= 39, @query_hints = N'OPTION(USE HINT(''QUERY_OPTIMIZER_COMPATIBILITY_LEVEL_160''))';

完全なチュートリアルについては、「クエリ ストアヒントの例」を参照してください。

アップグレード後に古い互換性レベルを検討する

クエリ ストア ヒントが役立つもう 1 つのケースは、SQL Server インスタンスの移行またはアップグレードの直後にクエリを変更できない場合です。 クエリ ストア ヒントを使用して、クエリが書き換えられるか、最新の互換性レベルで適切に実行されるように対処できるようになるまで、クエリに以前の互換性レベルを適用します。 クエリ ストアの後退したクエリ レポート、移行中のクエリ チューニング アドバイザー ツール、またはその他のクエリ レベルのアプリケーション テレメトリを使用して、より高い互換性レベルで後退した外れ値のクエリを特定します。 互換性レベルの違いの詳細については、「互換性レベルの違い」を参照してください。

この方法で新しい互換性レベルをテストし、クエリ ストア ヒントをデプロイした後、コードを変更することなく、以前の互換性レベルで主要な問題のあるクエリを維持しながら、データベース全体の互換性レベルをアップグレードできます。

クエリ ストア ヒントに関する考慮事項

クエリ ストア ヒントを配置するときは、次のシナリオを検討してください。

データ分散の変更

プラン ガイド、クエリ ストアを使用した強制プラン、クエリ ストア ヒントは、オプティマイザーの決定をオーバーライドします。 クエリ ストア ヒントが現時点で有益であっても、今後そうでなくなる可能性があります。 たとえば、クエリ ストア ヒントが以前のデータ分散でのクエリに役立つ場合、大規模な DML 操作によってデータが変更されると生産性が低下する可能性があります。 新しいデータ分散により、オプティマイザーでヒントよりも適切な決定が行われる可能性があります。 このシナリオは、プランの動作を強制することの最も一般的な結果です。

クエリ ストア ヒント戦略を定期的に再評価する

次の場合は、既存のクエリ ストア ヒント戦略を再評価します。

  • 既知の大規模なデータ分散が変更された後。
  • Azure SQL Database または Managed Instance あるいは仮想マシンのサービス レベル目標 (SLO) が変更された場合。
  • プランの修正が長く続いた場合。 クエリ ストア ヒントは、短期的な修正に最適です。
  • 予期しないパフォーマンスの低下。

広範な影響の可能性

クエリ ストア ヒントは、パラメーター セット、ソース アプリケーション、ユーザー、または結果セットに関係なく、クエリのすべての実行に影響します。 意図せずパフォーマンスが低下した場合、sys.sp_query_store_set_hints で作成されたクエリ ストア ヒントは、sys.sp_query_store_clear_hints で簡単に削除できます。

運用環境でクエリ ストア ヒントを適用する前に、ミッション クリティカルなシステムまたは機密性の高いシステムで変更の負荷テストを注意深く行います。

強制パラメーター化と RECOMPILE ヒントはサポートされていません

データベース オプション PARAMETERIZATION が FORCED に設定されている場合、クエリ ストア ヒントを使用した RECOMPILE クエリ ヒントの適用はサポートされません。 詳細については、「強制パラメーター化使用のガイドライン」をご覧ください。

RECOMPILE ヒントは、データベース レベルで設定された強制パラメーター化と互換性がありません。 データベースに強制パラメーター化が設定されていて、RECOMPILE ヒントがクエリのクエリ ストアに設定されているヒント文字列の一部である場合、データベース エンジンで RECOMPILE ヒントは無視され、他のヒントが利用されていれば適用されます。 さらに、Azure SQL Database の 2022 年 7 月以降、RECOMPILE ヒントが無視されたことを示す警告 (エラー コード 12461) を発行する必要があります。

どのクエリ ヒントを適用できるかについては、「サポートされているクエリ ヒント」を参照してください。

関連項目

次のステップ