実行速度の遅いクエリを分析するためのチェックリスト

クエリや更新の実行に予想よりも長時間かかる場合、さまざまな原因が考えられます。実行速度の遅いクエリは、SQL Server が実行されているネットワークまたはコンピューターに関連するパフォーマンスの問題が原因であることがあります。また、物理的なデータベース設計の問題が原因である場合もあります。

クエリや更新の実行速度が遅い場合に共通するいくつかの原因は次のとおりです。

  • 低速なネットワーク通信

  • サーバー コンピューターのメモリ不足、または SQL Server で使用可能なメモリ不足

  • 有用な統計の欠如

  • 有用なインデックスの欠如

  • 有用なインデックス付きビューの欠如

  • 有用なデータ ストライピングの欠如

  • 有用なパーティションの欠如

クエリまたは更新に予想よりも長時間かかっている場合は、次の質問に回答して、前のセクションで挙げられた実行速度の遅いクエリの原因に対処してください。

ヒントヒント

時間を節約するため、購入元に問い合わせる前にこのチェックリストを確認してください。

  1. パフォーマンスの問題はクエリ以外のコンポーネントに関係していますか。たとえば、低速なネットワーク パフォーマンスが問題ですか。パフォーマンス低下の原因となっているか、低下に影響しているコンポーネントが他にありますか。

    Windows システム モニターを使用して、SQL Server、および SQL Server に関係のないコンポーネントのパフォーマンスを監視できます。詳細については、「リソースの利用状況の監視 (システム モニタ)」を参照してください。

  2. パフォーマンスの問題がクエリに関連する場合、どのクエリまたはクエリ セットが関係していますか。

    SQL Server Profiler を使用して、時間のかかるクエリを特定します。詳細については、「SQL Server Profiler の使用」を参照してください。sys.dm_exec_query_stats 動的管理ビューおよび sys.dm_exec_requests 動的管理ビューを使用して、総合的に大量のリソースを消費している類似のクエリを見つけます。詳細については、「クエリおよびクエリ プラン ハッシュを使用した類似クエリの検索およびチューニング」を参照してください。

  3. 実行速度の遅いクエリのパフォーマンスをどのように分析しますか。

    実行速度の遅いクエリが特定されたら、プラン表示を生成することによってさらにクエリのパフォーマンスを分析することができます。プラン表示は、クエリ オプティマイザーが生成するクエリ実行プランのテキスト、XML、またはグラフィカル表示です。Transact-SQL SET オプション、SQL Server Management Studio、または SQL Server Profiler を使用してプラン表示を生成できます。

    Transact-SQL SET オプションを使用してテキストおよび XML 実行プランを表示する方法の詳細については、「プラン表示 SET オプションを使用した実行プランの表示 (Transact-SQL)」を参照してください。

    SQL Server Management Studio を使用してグラフィカル実行プランを表示する方法の詳細については、「グラフィカル実行プランの表示 (SQL Server Management Studio)」を参照してください。

    SQL Server Profiler を使用してテキストおよび XML 実行プランを表示する方法の詳細については、「SQL Server Profiler のイベント クラスを使用した実行プランの表示」を参照してください。

    これらのツールで収集した情報から、SQL Server クエリ オプティマイザーによってクエリがどのように実行され、どのインデックスが使用されているかを判別できます。また、クエリの書き直しやテーブルのインデックスの変更、さらにデータベース設計の変更によってパフォーマンスが向上するかどうかもわかります。詳細については、「クエリの分析」を参照してください。

  4. クエリは有用な統計情報を使用して最適化されていましたか。

    クエリ オプティマイザーでは、クエリのパフォーマンスを向上させるクエリ プランを作成するために統計を使用します。ほとんどのクエリでは、高品質のクエリ プランに必要な統計がクエリ オプティマイザーによって既に生成されていますが、最適な結果を得るために追加の統計情報を作成したりクエリのデザインを変更したりする必要がある場合もあります。

    詳細については、「クエリのパフォーマンスを向上させるための統計の使用」を参照してください。このトピックには、統計をより効果的に使用することでクエリのパフォーマンスを向上させるためのガイドラインが示されています。ガイドラインは次のとおりです。

    • データベース全体の統計オプションを使用する。たとえば、統計の自動作成オプション AUTO_CREATE_STATISTICS や統計の自動更新オプション AUTO_UPDATE_STATISTICS などのデータベース全体に適用されるオプションがオンになっていることを確認します。これらのオプションがオフになっている場合、最適ではないクエリ プランが作成されて、クエリのパフォーマンスが低下することがあります。

    • 統計を作成する場合を判断する。場合によっては、CREATE STATISTICS (Transact-SQL) ステートメントを使用して追加の統計を作成することで、クエリ プランが向上することがあります。これらの追加の統計では、クエリ オプティマイザーでインデックスまたは 1 列ずつの統計を作成する場合には考慮されない統計的相関関係を取り込むことができます。

    • 統計を更新する場合を判断する。場合によっては、AUTO_UPDATE_STATISTICS をオンにした場合より頻繁に統計を更新することで、クエリ プランが向上し、クエリのパフォーマンスが向上することがあります。統計は、UPDATE STATISTICS ステートメントまたは sp_updatestats ストアド プロシージャを使用して更新できます。

    • 統計を効果的に使用したクエリをデザインする。クエリ述語にローカル変数や複雑な式が含まれている場合など、特定のクエリ実装では、最適なクエリ プランにならないことがあります。クエリのデザイン ガイドラインに従って統計を効果的に使用することで、この問題を回避できる場合があります。

  5. 適切なインデックスが利用可能ですか。1 つ以上のインデックスの追加によって、クエリのパフォーマンスが向上するのではないでしょうか。詳細については、「インデックスの設計の全般的なガイドライン」、「欠落したインデックスの検索」、および「データベース エンジン チューニング アドバイザの概要」を参照してください。データベース エンジン チューニング アドバイザーでも、必要な統計情報の作成が推奨されます。

  6. データまたはインデックスがアクセスされる状態になっていますか。ディスク ストライピングを検討してください。ディスク ストライピングは、RAID (redundant array of independent disks) のレベル 0 を使用して実装できます。このレベルでは、複数のディスク ドライブにわたってデータが分散されます。詳細については、「ファイルとファイル グループの使用」および「RAID」を参照してください。

  7. クエリ オプティマイザーは複雑なクエリを最適化する方法を示していますか。詳細については、「クエリ チューニングに関する推奨設定」を参照してください。

  8. 大量のデータがある場合は、分割する必要がありますか。データ管理の容易性が分割の主な利点ですが、テーブルやインデックスが同様に分割されている場合、分割によってクエリのパフォーマンスが向上することもあります。詳細については、「パーティション分割について」および「物理データベース デザインのチューニング」を参照してください。