sql >> データベース >  >> RDS >> Sqlserver

SQL Server実行プラン—それは何であり、パフォーマンスの問題にどのように役立ちますか?

    SQL Server実行プランは、クエリのパフォーマンスの問題を調査するのに役立ちます。データベースの専門家は、クエリの実行が遅いというトラブルチケットやユーザーからの苦情を受け取ることがよくあります。以前は2、3分かかっていたクエリ結果が、突然30分以上かかります。トラブルシューティングでは、サーバーリソース(CPU、メモリ)、統計、ディスクパフォ​​ーマンス、ブロッキング、デッドロック、インデックスなどの領域を調査する必要がある場合があります。この記事では、パフォーマンスの問題を解決する上でのSQLServer実行プランの役割に焦点を当てます。

    SQL ServerでT-SQLを送信するとどうなりますか?

    SQLServerでTransact-SQLまたはT-SQLを使用してクエリを送信するとどうなるかを見てみましょう。もちろん、ユーザーにとっては違いはありません。ユーザーは、データベースのクエリであろうとWebの検索であろうと、正確な結果をすばやく得ることを期待しています。

    SQLクエリの高レベルのワークフロー

    1. ユーザーはクライアントアプリケーションでSQLServerに対して認証を行い、クエリを送信します。
    2. SQL Serverはクエリを解析し、構文エラーがないかチェックします。
    3. 解析ツリーはAlgebrizerでさらに処理され、クエリ内のすべてのオブジェクト、テーブル、および列が解決されます。また、列のデータ型のチェックも実行します。問題が発生した場合は、エラーが返されます。 Algebrizerは、クエリプロセスツリーとクエリハッシュを生成します。実行プランがすでに存在する場合、SQL Serverはそのキャッシュされたプランを使用して、クエリを実行します。
    4. プランが存在しない場合、またはプランが廃止された場合、クエリオプティマイザーは、統計、クエリプロセスツリー、および制約を使用して、完全なコストベースの最適化を実行します。これらの入力に基づいて、コストが最適化されたSQLServer実行プランを作成します。
    5. 最後に、SQL Serverクエリエンジンは実行プランに従ってクエリを実行し、結果を返します。

    SQLServer実行プランの概要

    SQL Serverの実行プランは、データベースの専門家がクエリのパフォーマンスをトラブルシューティングし、効率的なクエリを作成するのに役立ちます。クエリの実行に長い時間がかかる場合、SQL Server実行プランは、クエリが最も多くのリソースと時間を費やしているポイントを特定するのに役立ちます。

    次のいずれかを使用して、実行プランを生成できます。

    1. SQL Server Management Studio
    2. Azure Data Studio
    3. SQLServerプロファイラー
    4. 拡張イベント
    5. 動的管理ビュー
    6. サードパーティのデータベース監視ソフトウェア

    #1から#5によって生成された実行計画は類似しています。サードパーティのデータベース監視ソフトウェア(#6)は、色分けを使用してコストのかかるオペレーターを識別する追加機能を提供します。

    SQL Serverは、車を修理する必要があるときに経験するものと同様の、推定および実際の実行プランを提供します。整備士があなたの車両を検査し、次にあなたはあなたの要件、車両の状態、そして整備士が修理にかかると考えるおおよその時間と材料に基づいて作業の見積もりを受け取ります。もちろん、推定および実際のSQL Server実行プランの場合と同様に、実際のコストと時間は異なる場合があります。

    推定実行計画

    クエリを実行せずに、SQL Server統計に基づいて推定(論理)SQLServer実行プランを取得できます。 SQL Server Management Studio(SSMS)では、次の手順に従います。

    1. クエリを強調表示します(特定のクエリの実行プランが必要な場合)。
    2. 以下に示すように、[推定実行プランの表示]ボタン(キーボードショートカットのCtrl + L)をクリックします。

    SQLServerが推定計画を作成できない場合があります。たとえば、パラメータがクエリでその値を指定せずに使用された場合、または一時テーブルが宣言されていない場合。

    実際の実行計画

    クエリをSQLServerに送信すると、SQLServerがクエリを実行するために実行した手順を表す実際の実行プランを取得できます。車両修理シナリオと同様に、これは実際に受け取る請求書のようなものです。

    実際の実行プランを取得するには、クエリを実行する前に、SSMSで以下の手順を実行してください。

    1. クエリを強調表示します。
    2. 実際の実行プランを表示をクリックします ボタン(キーボードショートカット Ctrl + M )、上記のように。

    SQLServer実行プランの形式

    デフォルトでは、上記で説明したSSMSプロシージャは、SQLServer実行プランをグラフィカル形式で生成します。ただし、実行プランを3つの異なる形式で表示するオプションがあります。

    1. グラフィカル
    2. XML
    3. テキスト

    これらの各形式を見てみましょう。

    1。グラフィカルな実行計画

    グラフィカルな計画は、以下に示すように、データフローを含むすべてのコンポーネントを示しています。

    オペレーター

    演算子はアイコンとして表示されます。各オペレーターは、特定のタスクを実行するように指定されています。たとえば、SQL Serverのクエリオプティマイザは、テーブルスキャン、インデックススキャン、およびシークを実行する場合があります。これは、クラスター化されたインデックスシークオペレーターが[AdventureWorks2019]。[HumanResources]テーブルのインデックスからデータをプルするときの外観です:

    パーセンテージコスト

    グラフィカルな計画には、オペレーターに関連するコストのパーセンテージ(ここでは、クラスター化されたインデックスシークの99%)も示されています。そのコストは、クエリの実行に使用される他の演算子に関連しています。

    データフローの矢印

    矢印は演算子を接続します。その幅は、ある演算子から次の演算子に移動するデータの行数を反映しています。

    たとえば、クエリが1行の出力しか生成しないが、完了するまでに長い時間がかかるとします。実行プランのデータフロー矢印にマウスを移動すると、読み取られた行の数が数百万になっていることがわかります。これは、リソース使用率の大きな不均衡を表しており、最適化が必要な領域を明らかにしています。

    ツールチップ

    以下に示すように、演算子の上にマウスを置くと、データフローに関するより多くの統計情報とともにツールチップが表示されます。

    プロパティウィンドウ

    [プロパティ]ウィンドウには、オペレーターとそのコンポーネントに関する詳細情報が表示されます。これはツールチップのスーパーセットです。

    2。 XML形式のSQLServer実行プラン

    XML実行プランは、特定の構造化された形式です。 XML形式は視覚的に直感的ではありませんが、XMLのすべての詳細を保持し、プロパティとツールチップを表示するための追加の手順は必要ありません。 XML形式をグラフィカル形式に、またはその逆に簡単に変換できます。

    グラフィカルな実行プランをXML形式に変換するには、それを右クリックして、[実行プランのXMLを表示]を選択します。 、以下に示すように。

    結果は、次の構造化されたXML形式の実行プランです。

    次のコマンドも、XML形式で実行プランを生成します。

    • 見積もりプランの場合:SET SHOWPLAN_XML ON
    • 実際の計画の場合:SET STATISTICS_XML ON

    3。テキスト形式のSQLServer実行プラン

    実行プランはいくつかの方法で生成できます。

    • SHOWPLAN_TEXTをオンに設定

    このコマンドは、推定値を生成します 実行計画、なし クエリ実行の詳細情報。 sqlcmdユーティリティなどのアプリケーションを対象としています。

    • SHOWPLAN_ALLONを設定

    このコマンドは、推定値を生成します 実行計画、あり 表形式のすべての演算子と操作に関する詳細情報。

    • 統計プロファイルの設定

    このコマンドは、クエリの実行後に、実際の実行プランを表形式で生成します。

    推定されるSQLServerの実行プランと実際のSQLServerの実行プランが異なるのはなぜですか?

    推定実行計画と実際の実行計画は一般的に類似していますが、状況によっては異なる場合があります。

    古い統計

    推定実行計画と実際の実行計画が異なる主な理由は、統計が古くなっていることです。

    クエリオプティマイザは、統計を使用して、費用効果が高く最適化されたクエリ実行プランを作成します。統計が更新されない場合、またはデータサンプリングが適切でない場合、クエリオプティマイザは完全な最適化を実行し、古い情報に基づいて実行プランを構築します。また、クエリのパフォーマンスの問題につながる可能性のある非効率的な実行プランを取得することもできます。

    データが頻繁に変更され、インデックスのメンテナンスに従って統計が更新されない場合、古い統計が発生することがあります。

    シリアルまたはパラレルSQLServer実行プラン

    コンパイル時に、クエリオプティマイザは実行プランを作成し、クエリコストと並列処理のコストしきい値に応じて、シリアルプランまたはパラレルプランを作成します。実行プランはシリアルモードとパラレルモードの両方で同じである可能性がありますが、SQLServerはサーバーのリソースとアクティビティに基づいてどちらかを決定します。

    無効な見積もり

    前述のように、Algebrizerは、SQLクエリを実行する前にオブジェクトの名前をバインドします。 testという名前のテーブルが実行時に作成されるように指定してから、推定実行プランを生成しようとするとします。そのテーブルは存在しないため、以下に示すようなエラーメッセージが表示されます。

    実行プランの使用

    要約すると、SQL Serverの実行プランをグラフィック、XML、テキスト形式で生成し、それを使用してデータベースのパフォーマンスの問題に対処することができます。

    クエリ実行計画は、クエリワークフロー、オペレーター、およびコンポーネントを特定するための主要なステップであるため、可能な改善のためにクエリを調整できます。実行計画の使用の詳細については、投稿「実行計画を読んで分析する方法」をご覧ください。


    1. `in`句にすべての値を持つ列のみでクエリを結合します

    2. @Queryを使用してSPRINGBOOTのファイルからクエリを取得する

    3. 1つのWebページで複数のMySQLデータベースにどのように接続しますか?

    4. EntityFrameworkと複数のスキーマ