サーバーで実行が遅いクエリのトラブルシューティングSQL Server

はじめに

この記事では、特定のクエリまたはクエリ グループのパフォーマンスが低下する SQL Server と共にアプリケーションで発生する可能性のあるパフォーマンスの問題を処理する方法について説明します。 パフォーマンスの問題をトラブルシューティングしているが、問題を特定のクエリまたは予想より遅い小さなクエリ グループに分離していない場合は、続行する前に、「Monitor and Tune for Performance」 を参照してください。

この記事では、298475 を使用して問題の範囲を絞り込み、記事 224587 で詳細な特定のイベントとデータ列を含む SQL Profiler トレースをキャプチャしたと仮定します。

データベース クエリのチューニングは、多面的な試みになります。 次のセクションでは、クエリのパフォーマンスを調査する際に調べる一般的な項目について説明します。

元の製品バージョン:  SQL Server
元の KB 番号:   243589

正しいインデックスの存在を確認する

クエリの実行時間が遅い場合に実行する最初のチェックの 1 つは、インデックス分析です。 1 つのクエリを調査する場合は、クエリ アナライザーの [クエリの分析] データベース エンジン チューニング アドバイザーをSQLできます。大規模なワークロードのSQLプロファイル トレースがある場合は、次のデータベース エンジン チューニング アドバイザー。 どちらのメソッドも、SQL Serverオプティマイザーを使用して、指定したクエリに役立つインデックスを特定します。 これは、データベースに正しいインデックスが存在するかどうかを判断する効率的な方法です。

このツールの使い方についてはデータベース エンジン チューニング アドバイザーオンラインの「スタートと使用」データベース エンジン チューニング アドバイザーを参照SQL Serverしてください。

以前のバージョンの SQL Server からアプリケーションをアップグレードした場合、オプティマイザーとストレージ エンジンの変更により、新しい SQL Server ビルドで異なるインデックスの方が効率的になる場合があります。 このデータベース エンジン チューニング アドバイザーインデックス戦略の変更によってパフォーマンスが向上するかどうかを判断するのに役立ちます。

すべてのクエリ、テーブル、および結合ヒントを削除する

ヒントはクエリの最適化を上書きし、クエリ オプティマイザーが最も高速な実行プランを選択するのを防ぐ可能性があります。 オプティマイザーの変更により、SQL Server の以前のバージョンのパフォーマンスが向上したヒントは、後のビルドのパフォーマンスに影響を及ぼしたり、パフォーマンスに悪影響を与SQL Serverします。 さらに、結合ヒントは、次の理由に基づいてパフォーマンスが低下する可能性があります。

  • 結合ヒントを使用すると、アドホック クエリがクエリ プランの自動パラメーター化とキャッシュの対象となるのを防ぐ。

  • 結合ヒントを使用する場合は、明示的にヒントを使用しない場合でも、クエリ内のすべてのテーブルに対して強制的に結合順序を設定する必要があります。

分析するクエリにヒントが含まれる場合は、ヒントを削除してから、パフォーマンスを再評価します。

実行計画の確認

正しいインデックスが存在し、オプティマイザーが効率的なプランを生成する機能を制限しているヒントがない場合は、クエリ実行計画を確認できます。 次の方法を使用して、クエリの実行計画を表示できます。

  • SQLProfiler

    SQL Profiler で MISC: Execution Plan イベントをキャプチャした場合、システム プロセス ID (SPID) のクエリの StmtCompleted イベントの直前に発生します。

  • SQLクエリ アナライザー: グラフィカル 表示プラン

    クエリ ウィンドウでクエリが選択されている場合は、[クエリ] メニューをクリックし、[推定実行計画の表示] をクリックします。

    注意

    ストアド プロシージャまたはバッチが一時テーブルを作成して参照する場合は、実行計画を表示する前に SET STATISTICS PROFILE ON ステートメントを使用するか、一時テーブルを明示的に作成する必要があります。

  • SHOWPLAN_ALLSHOWPLAN_TEXT

    推定実行計画のテキスト バージョンを受け取る場合は、SET オプションと SET SHOWPLAN_ALL使用 SHOWPLAN_TEXT できます。 詳細については 、「SHOWPLAN_ALL ブック オンライン」の「SET SHOWPLAN_ALL (T-SQL SQL Server) および SET SHOWPLAN_TEXT (T-SQL) のトピックを参照してください。

    注意

    ストアド プロシージャまたはバッチが一時テーブルを作成して参照する場合は、[ 統計プロファイルの 設定] オプションを使用するか、実行計画を表示する前に一時テーブルを明示的に作成する必要があります。

  • 統計プロファイル

    推定実行計画をグラフィカルに表示するか、SHOWPLAN を使用して表示する場合、クエリは実行されません。 したがって、バッチまたはストアド プロシージャで一時テーブルを作成した場合、一時テーブルが存在しないので、推定実行計画を表示できません。 STATISTICS PROFILE は最初にクエリを実行し、実際の実行計画を表示します。 詳細については 、「オンライン ブック」の「統計プロファイルの設定 (T-SQL)SQL Server」 を参照してください。 クエリ アナライザーで実行SQL、結果ウィンドウの [実行計画] タブにグラフィック形式で表示されます。

推定実行計画を表示する方法の詳細については、「オンライン ブック」の「推定実行計画を表示するSQL Server参照してください。

Showplan 出力を確認する

Showplan 出力は、特定のクエリに対して使用SQL Server実行計画に関する多くの情報を提供します。 最適なプランを使用するかどうかを判断するために表示できる実行計画の基本的な側面を次に示します。

  • 正しいインデックスの使用法

    showplan 出力には、クエリに関係する各テーブルと、クエリからデータを取得するために使用されるアクセス パスが表示されます。 グラフィカルな表示プランを使用して、ポインターをテーブルの上に移動して、各テーブルの詳細を確認します。 インデックスが使用されている場合は、「Index Seek」と表示されます。インデックスが使用されていない場合は、ヒープのテーブル スキャンまたはクラスター化インデックスを持つテーブルのクラスター化インデックス スキャンが表示されます。 クラスター化インデックス スキャンは、クラスター化インデックスが個々の行に直接アクセスするために使用されているのではなく、クラスター化インデックスを介してテーブルがスキャンされている状態を示します。

    有用なインデックスが存在し、クエリに使用されていないと判断した場合は、インデックス ヒントを使用してインデックスを作成できます。 インデックス ヒントの詳細については、「SQL ブック オンライン」の「FROM (T-SQL SQL Server)」 を参照してください。

  • 正しい結合順序

    showplan 出力は、クエリに関係するテーブルが結合されている順序を示します。 入れ子になったループ結合の場合、一覧表示される上のテーブルは外側のテーブルであり、2 つのテーブルの小さい方のテーブルである必要があります。 ハッシュ結合の場合、上のテーブルはビルド入力になり、2 つのテーブルの中で小さくなります。 ただし、オプティマイザーが間違った判断をしたと判断した場合、クエリ プロセッサは実行時にビルド入力とプローブ入力を取り消す可能性があるため、順序の重大性が低いことに注意してください。 showplan 出力で行数の推定値を確認することで、返される行数を少なくすることができます。

    クエリが別の結合順序の恩恵を受ける可能性がある場合は、結合ヒントを使用して結合順序を設定してみてください。 参加ヒント の詳細についてはSQLオンラインの FROM (T-SQL Server) トピックを参照してください。

    注意

    大規模なクエリで結合ヒントを使用すると、クエリ内の他のテーブルの結合順序は、設定された場合と同様に暗黙的に FORCEPLAN 強制的に行います。

  • 正しい結合の種類

    SQL Serverループ、ハッシュ、および結合結合を使用します。 実行が遅いクエリで別の結合手法を使用している場合は、別の結合の種類を適用できます。 たとえば、クエリでハッシュ結合を使用している場合は、LOOP 結合ヒントを使用して入れ子になったループを強制的に結合できます。 参加ヒントの詳細については、「SQL Server ブック オンライン」の「FROM (T-SQL)」を参照してください。

    大規模なクエリで結合ヒントを使用すると、クエリ内の他のテーブルの結合の種類は、設定された場合と同様に暗黙的に FORCEPLAN 強制的に適用されます。

  • 並列実行

    マルチプロセッサ コンピューターを使用している場合は、並列プランが使用されているかどうかを調べすることもできます。 並列処理が使用されている場合は、PARALLELISM (Gather ストリーム) イベントが表示されます。 並列プランを使用している場合に特定のクエリが遅い場合は、OPTION (MAXDOP 1) ヒントを使用して、並列ではないプランを適用できます。 詳細については、「オンライン ブック」の「SELECT (T-SQL)」SQL Serverを参照してください。

Showplan 実行計画出力を使用する方法の詳細については、「オンライン ブックオンライン」の次SQL Server参照してください。

  • 実行プランを XML 形式で保存する

  • 実行プランの比較と分析

  • Showplan 論理演算子と物理演算子リファレンス

注意事項

クエリ オプティマイザーは通常、クエリに最適な実行計画を選択しますので、経験豊富なデータベース管理者である場合にのみ、結合ヒント、クエリ ヒント、およびテーブル ヒントを最後の方法としてのみ使用してください。