現在オフラインです。再接続するためにインターネットの接続を待っています

SQL Server 7.0 以降で実行に時間のかかるクエリのトラブルシューティング

この記事は、以前は次の ID で公開されていました: JP243589
概要
この資料では、アプリケーションで Microsoft SQL Server を使用するときに発生するパフォーマンスの問題のうち、特定のクエリまたはクエリ グループの実行に時間がかかる問題について説明します。パフォーマンスに関するトラブルシューティングを行う場合、予想よりも時間のかかるクエリまたは少数のクエリのグループを特定できていない場合は、次の手順に進む前に、以下の「サポート技術情報」 (Microsoft Knowledge Base) の資料を参照してください。
224587 [HOWTO] SQL Server に関するアプリケーション パフォーマンスのトラブルシューティング
これ以降は、既に上記の資料 224587 を使用して問題の発生部分を絞り込み、また、上記資料で詳しく説明されている特定のイベントおよびデータ列についての SQL Server プロファイラのトレースを取得しているという前提で説明します。

データベース クエリのチューニングは、さまざまな側面から行うことができます。以下では、クエリのパフォーマンスを調べるときに、チェックする一般的な項目について説明します。

: SQL Server 2005 を使用している場合は、SQL クエリ アナライザではなく SQL Server Management Studio を使用し、インデックス チューニング ウィザードではなくデータベース エンジン チューニング アドバイザを使用します。
先頭に戻る

適切なインデックスの存在の確認

クエリの実行に時間がかかる場合に、最初に行うパフォーマンス チェックの 1 つはインデックス分析です。単一のクエリについて調査している場合は、クエリ アナライザの [インデックス分析の実行] オプションを使用できます。大きなワークロードの SQL プロファイラのトレースがある場合は、インデックス チューニング ウィザードを使用できます。どちらの方法でも、SQL Server クエリ オプティマイザを使用して、指定されたクエリに役立つインデックスを特定します。これは、データベース内に適切なインデックスが存在するかどうかを調べる場合に非常に効率的な方法です。

インデックス チューニング ウィザードの使用方法については、SQL Server Books Online の「インデックス チューニング ウィザード」を参照してください。

SQL Server を以前のバージョンからアップグレードしている場合、オプティマイザとストレージ エンジンが変更されているので、インデックスを変更すると SQL Server での効率が上がる場合があります。インデックス チューニング ウィザードを使用すると、インデックス構造の変更によってパフォーマンスが向上するかどうかを判断できます。

SQL Server 2005 でインデックス チューニング ウィザードではなくデータベース エンジン チューニング アドバイザを使用する方法の詳細については、SQL Server 2005 Books Online の以下のトピックを参照してください。
  • データベース エンジン チューニング アドバイザとインデックス チューニング ウィザードの相違点
  • データベース エンジン チューニング アドバイザのチュートリアル
先頭に戻る

すべてのクエリ、テーブル、結合ヒントの削除

ヒントを使用すると、クエリの最適化を上書きして、最も速い実行プランをクエリ オプティマイザが選択できないようにできます。このバージョンではオプティマイザが変更されているので、以前のバージョンの SQL Server でパフォーマンスの向上に役立ったヒントが、SQL Server 7.0 では効果がなかったり、パフォーマンスを低下させたりする場合があります。さらに、結合ヒントも、次のような理由でパフォーマンスを低下させる可能性があります。
  • 結合ヒントを使用すると、アドホック クエリが、クエリ プランの自動パラメータ化と、その後のキャッシュの対象から外れます。
  • 結合ヒントを使用すると、そのクエリ内のすべてのテーブルに特定の結合順序を強制することになります。これは、結合でヒントが明示的に使用されていない場合も同じです。
分析中のクエリにヒントが含まれている場合は、それを削除してパフォーマンスを再評価します。

先頭に戻る

実行プランの確認

適切なインデックスが存在し、効率的なプランを生成するオプティマイザ機能を制限するヒントがないことを確認したら、今度はクエリ実行プランを調べます。クエリ実行プランは、以下のような多くの方法で表示できます。
  • SQL プロファイラ

    SQL Server プロファイラで、その他 (SQL Server 2000 ではパフォーマンス) :Execution Plan イベントをキャプチャした場合、このイベントは、特定のシステム プロセス ID (SPID) のクエリの StmtCompleted イベントの直前にキャプチャされます。
  • クエリ アナライザ : グラフィカルなプラン表示

    クエリ ウィンドウでクエリを選択した状態で、[クエリ] メニューの [推定実行プランの表示] をクリックします。

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

    テキスト版の推定実行プランを表示するには、SET SHOWPLAN_ALL オプションおよび SET SHOWPLAN_TEXT オプションを使用します。詳細については、SQL Server Books Online の「SET SHOWPLAN_ALL (T-SQL)」および「SET SHOWPLAN_TEXT (T-SQL)」を参照してください。

    : ストアド プロシージャまたはバッチで一時テーブルを作成および参照する場合は、SET STATISTICS PROFILE ON オプションを使用するか、実行プランを表示する前に一時テーブルを明示的に作成する必要があります。
  • STATISTICS PROFILE

    推定実行プランを表示するときには、グラフィック表示の場合も SHOWPLAN を使用する場合も、実際にはクエリは実行されません。したがって、バッチまたはストアド プロシージャ内で一時テーブルを作成しても、一時テーブルは実際には存在しないので、推定実行プランを表示できません。STATISTICS PROFILE では、まずクエリを実行し、次に実際の実行プランを表示します。詳細については、SQL Server Books Online の「SET STATISTICS PROFILE (T-SQL)」を参照してください。クエリ アナライザで実行している場合は、結果ペインの [推定実行プラン] タブにプランがグラフィック形式で表示されます。
SQL Server 2005 で推定実行プランを表示する方法の詳細については、SQL Server 2005 Books Online の「推定実行プランを表示する方法」を参照してください。
先頭に戻る

プラン表示出力の確認

プラン表示の出力では、特定のクエリについて SQL Server が使用する実行プランの詳しい情報が表示されます。生成される情報とイベントの詳細については、SQL Server Books Online の「データベース パフォーマンスの最適化の概要」で詳しく説明されています。最適なプランを使用しているかどうかを判断するには、実行プランを以下のような基本的な側面からチェックします。
  • 適切なインデックスの使用

    プラン表示の出力には、クエリに関連する個々のテーブルと、そこからデータを取得するために使用されるアクセス パスが表示されます。グラフィカルなプラン表示の状態で、テーブルをマウス ポインタでポイントすると、関連するテーブルごとの詳細が表示されます。インデックスが使用されている場合は "Index Seek"、使用されていない場合はヒープでは "Table Scan"、クラスタ化インデックスを含むテーブルでは "Clustered Index Scan" と表示されます。"Clustered Index Scan" は、テーブルでクラスタ化インデックスがスキャンされていることを示すもので、個別の行に直接アクセスするためにクラスタ化インデックスが使用されているのではありません。

    有用なインデックスが存在しており、それがクエリで使用されていないことがわかった場合は、インデックス ヒントを使用して、そのインデックスを強制的に使用することができます。インデックス ヒントの詳細については、SQL Server Books Online の「FROM (T-SQL)」を参照してください。
  • 適切な結合順序

    プラン表示の出力では、クエリと関連するテーブルが結合されている順序もわかります。ネストされたループ結合の場合、上方に表示されているテーブルが外部テーブルで、これは 2 つのテーブルの小さい方になります。ハッシュ結合の場合は、同様に上に表示されているテーブルがビルド入力で、これも小さい方のテーブルになります。ただし、クエリ プロセッサは、オプティマイザの決定が正しくないと判断した場合に、実行時にビルド入力とプローブ入力を逆にできるので、順序はそれほど重要ではありません。プラン表示の出力で見積行数を調べて、返した行数が少ないテーブルを判断できます。

    結合順序を変更した方がクエリの効率が上がる場合は、その順序が使用されるように結合ヒントを設定します。結合ヒントの詳細については、SQL Server Books Online の「FROM (T-SQL)」を参照してください。

    : 大きなクエリで結合ヒントを使用すると、そのクエリ内の他のテーブルについても、FORCEPLAN が設定された場合と同じように、暗黙的に同じ結合順序が強制されます。
  • 適切な結合の種類

    SQL Server では、ネスト化ループ、ハッシュ、およびマージの各結合を利用できます。低速なクエリでいずれかの結合方法が使用されている場合は、別の種類の結合を使用するように変更してみます。たとえば、ハッシュ結合が使用されている場合は、LOOP 結合ヒントを使用して、ネスト化ループ結合が使用されるようにします。結合ヒントの詳細については、SQL Server Books Online の「FROM (T-SQL)」を参照してください。

    : 大きなクエリで結合ヒントを使用すると、そのクエリ内の他のテーブルについても、FORCEPLAN が設定された場合と同じように、暗黙的に同じ種類の結合が強制されます。
  • 並列実行

    マルチプロセッサ コンピュータを使用している場合は、並列プランが使用されているかどうかも調べることができます。並列処理が使用されている場合は、PARALLELISM (Gather Streams) イベントが発生します。並列プランを使用するクエリの実行が遅い場合は、OPTION (MAXDOP 1) ヒントを使用して、非並列プランを強制的に使用してみることができます。詳細については、SQL Server Books Online の「SELECT (T-SQL)」を参照してください。
SQL Server 2005 のプラン表示の実行プラン出力を使用する方法の詳細については、SQL Server 2005 Books Online の以下のトピックを参照してください。
  • 実行プランを XML 形式で保存する方法
  • XML プラン表示
  • プラン表示のセキュリティ
注意 : 通常は、クエリ オプティマイザによって、そのクエリに最適な実行プランが選択されます。したがって、熟練したデータベース管理者が最後の手段としてのみ結合ヒント、クエリ ヒントおよびテーブル ヒントを使用することをお勧めします。先頭に戻る
関連情報
SQL Server Books Online の以下のトピックでは、クエリの最適化について説明しています。
  • 効率的データ取得方法を使用したアプリケーション パフォーマンスの最適化
  • クエリのチューニング
  • クエリ チューニングに関する推奨設定
  • Transact-SQL に関するヒント
先頭に戻る
プロパティ

文書番号:243589 - 最終更新日: 05/12/2011 08:45:00 - リビジョン: 6.0

Microsoft SQL Server 2000 Standard Edition, Microsoft SQL Server 2000 64-bit Edition, Microsoft SQL Server 7.0 Standard Edition, Microsoft SQL Server 2005 Standard Edition, Microsoft SQL Server 2005 Developer Edition, Microsoft SQL Server 2005 Enterprise Edition, Microsoft SQL Server 2005 Workgroup Edition

  • kbsqlmanagementtools kbhowtomaster KB243589
フィードバック
one;" onerror="var m=document.createElement('meta');m.name='ms.dqp0';m.content='true';document.getElementsByTagName('head')[0].appendChild(m);" onload="var m=document.createElement('meta');m.name='ms.dqp0';m.content='false';document.getElementsByTagName('head')[0].appendChild(m);" src="http://c1.microsoft.com/c.gif?">