SQLクエリ実行プランは、クエリオプティマイザがクエリによって要求されたデータを配信するための最も効率的な方法を決定したときに生成されます。これらのプランは、クエリが実行しているデータベース操作を表したものであり、クエリが使用するオブジェクト、使用の種類、およびそれらの使用方法を示しています。
クエリのパフォーマンスが低いことが、データベース内で何かが間違っていることを示す重要な指標であることはよく知られています。したがって、クエリの実行プランを「内部」で確認することは、パフォーマンスの問題の原因を特定するための最良の方法の1つです。
SQL実行プランで利用可能な情報は、問題の根本原因を突き止め、必要に応じてクエリを調整できるため、SQLServerクエリのパフォーマンスの問題をトラブルシューティングするDBAにとって非常に貴重です。
SQL実行プランの調査は、パフォーマンスチューニングの最初のステップのひとつです。プランは、高価な演算子、演算子間を流れる異常な数のレコード、余分な演算子など、クエリ内で最も可能性の高い問題の原因を明確に強調しているためです。
DBAは、tempdbの流出やインデックスの欠落などの問題についてユーザーに警告する実行プランの警告の恩恵も受けます。
SQL実行プランの種類
SQL実行プランには、主に2つのタイプがあります。推定実行プランと実際の推定プランです。
推定実行計画は、一種の天気予報として最もよく説明されます。名前が示すように、推定実行プランは、近似計算、統計、およびその他のパラメーターを使用して、クエリの解析後にSQLServerエンジンが送信されたクエリを実行するために実行できるステップを推定します。
このタイプの実行プランを生成するためにクエリを実行する必要がないため、実際の実行プランの生成に時間がかかる複雑なクエリに適しています。
実際の実行計画は、送信されたクエリを実行してから、実行中に発生したステップを表示します。このタイプのプランには、実際の計算と、SQL Serverエンジンが従う実際の(推定されていない)ステップが表示されます。
このタイプの実行プランは実際にクエリを実行するため、クエリのパフォーマンスの問題をトラブルシューティングするのに適しています。
SQL実行プランを生成する方法
Hackernoonは、推定および実際の実行計画を生成する方法の簡潔な説明を提供します。このプロセスは、次の手順に要約できます。
推定実行計画を生成する
- データベースに移動します
- クエリを強調表示する
- [クエリ]をクリックします
- [推定実行プランの表示]をクリックするか、ショートカットCtrl+Lを使用します
実際の実行計画を作成する
- データベースに移動します
- クエリを強調表示する
- [クエリ]をクリックします
- [実際の実行プランを含める]をクリックするか、ショートカットCtrl+Mを使用します
推定実行計画と実際の実行計画を生成する方法の詳細な説明は、Microsoftの公式ドキュメントにあります。
推定SQL実行プランと実際のSQL実行プランが異なる理由
一般的に、推定実行計画と実際の実行計画は類似しています。ただし、異なる場合があります。これは正常であり、データベースの統計と実際のデータが異なるために発生します。これらの違いは、いくつかのチャネルを通じて導入される可能性があります:
並列処理
プランコストにより、送信されたクエリに対して2つの実行プランが作成される可能性があります。 SQL Serverエンジンは、並列プランを使用するかどうかを選択するため、一方のプランで並列プランを使用し、もう一方のプランでシリアルプランを使用することができます。
古い統計
テーブルとインデックスにデータを挿入したり、テーブルとインデックスからデータを削除したり、テーブルまたはインデックススキーマを変更したりすると、統計が変更されます。統計が定期的に更新されない場合、実際の実行計画は推定実行計画とは異なります。
無効な見積もり計画
クエリに、クエリが実行された場合にのみ存在する一時テーブルを必要とするステートメントが含まれている場合、クエリが実行されていないため、推定実行プランを生成するとエラーが発生します。クエリが実行されたため、同じクエリが実際の実行プランで正常に実行されます。
SQL実行プランは、SQLServerのパフォーマンスの問題をトラブルシューティングするための貴重なリソースです。推定SQL実行プランと実際のSQL実行プランの両方を生成する方法を知ることは、最適なパフォーマンスを得るためにクエリを調整するタスクを行うDBAにとって不可欠なツールです。