次の方法で共有


待機の種類ASYNC_NETWORK_IO起因する低速クエリのトラブルシューティング

現象

SQL Serverが結果セットを生成し、結果を出力バッファーに配置してクライアント アプリケーションに送信すると、クライアント アプリケーションは出力バッファーからそれらをフェッチします。 クライアント アプリケーションが停止した場合、または結果が十分に高速にフェッチされない場合は、SQL Server クライアント アプリケーションがすべての結果を受信したことを確認するまで待ってから、より多くの結果を送信する必要があります。 この待機は として ASYNC_NETWORK_IO表示されます。 詳細については、「SQL Serverで待機するASYNC_NETWORK_IOについて」のビデオを参照してください。

過剰なASYNC_NETWORK_IO待機は、次の 2 つの問題を引き起こす可能性があります。

  • クエリの合計時間が長くなるため、クエリの速度が低下する可能性があります。

  • SQL Serverクライアントが結果をフェッチするのを待つと、取得したロックを解放できません。 ロックが長時間解放されていない場合、他のセッションはSQL Serverでブロックされます。

原因と解決策

次のセクションでは、この待機の種類の一般的な原因と、問題を解決するための対応する手順を示します。

大きな結果セット

一部のアプリケーション クライアントでは、数千または数百万の行を要求し、フィルター、並べ替え、集計を適用して結果を処理します。 結果セットが大きいと、不要なネットワーク使用率とクライアント アプリケーション処理が発生する可能性があります。

解像 度:アプリケーション開発者は、SQL Serverとクライアントの間で処理のバランスを慎重に取る必要があります。 フィルター処理または集計は、SQL Serverによって実行でき、最終的な結果セットは小さい場合があります。 クライアントに到着する結果セットを制限します。 データを受信した後、クライアント側では、データ、プレゼンテーション、書式設定に対するそれ以上の計算がより適切です。

アプリケーションが結果を十分に高速にフェッチしない

クライアント アプリケーションが結果を十分に高速にフェッチせず、結果セットが受信されたことをSQL Server通知しない場合、ASYNC_NETWORK_IO待機はサーバーで発生します。

ADO.NET の使用を示すために、既定では、DataSetDataTable は、クライアントがアクセスする前にすべての行を完了にフェッチします。 ただし、 SqlDataReader などのクラスを使用すると、アプリケーション開発者は、各行がサーバーからフェッチされた後に実行する処理を選択できます。 アプリケーションは、一度に 1 つの行をフェッチし、ビジネス要件に従ってこの行を処理できます。 例:

  • 行をファイルに書き込みます。

  • ネットワーク経由で行を別のアプリケーションに送信します。

  • しばらく待つか、ユーザー入力を待ちます。

解像 度: この問題を解決するには、タイトな WHILE/FOR ループを使用して、クライアントができる限り速くすべての結果をフェッチします。 つまり、結果をメモリに格納し、その後より多くの処理を行うだけです。

クライアント アプリケーション マシンがストレス (I/O、メモリ、または CPU) を受けている

結果をできるだけ速くフェッチするようにアプリケーション コードを開発した場合でも、システム リソースの問題により、クライアント プロセス全体が遅くなる可能性があります。 例:

クライアント アプリケーションを実行するマシンにリソース制約がある場合、アプリケーションは結果を迅速にフェッチできない可能性があります。 例:

  • 100% CPU 使用率

  • メモリ不足 (すべてのメモリが消費されます)

  • 低速 I/O (アプリケーションが結果またはログを書き込む場合があります)

これらのリソース制約により、受信結果の処理が遅くなり、待機の種類ASYNC_NETWORK_IOが発生するSQL Serverが発生する可能性があります。

解像 度:この問題を解決するには、パフォーマンス モニター などのツールを使用して、アプリケーションを実行するシステムを診断し、リソースの制約を排除します。 次のいずれかの方法が適しています。

  • 他のアプリケーションの実行を停止します。

  • これらのアプリケーションのコードの問題を修正します。

  • アプリケーションが完全にチューニングされている場合は、システム上のハードウェアをアップグレードします。

NIC/ネットワーク

ネットワークまたはネットワーク インターフェイス カード (NIC) が遅いと、ネットワーク トラフィックの遅延が発生する可能性があり、結果のフェッチとSQL Serverとの通信が自然に遅延します。 ネットワーク遅延は、通常、次の問題が原因で発生します。

  • ネットワーク アダプター ドライバーの問題

  • ネットワーク フィルター ドライバーの問題

  • 正しく構成されていないファイアウォールまたは障害のあるファイアウォール

  • ルーターの問題

  • トラフィックによる過負荷ネットワーク (あまり一般的ではない)

解像 度: これらの問題を診断するには、 ネットワーク トレースを収集 し、パケットのリセットと再送信を探します。 その後、ネットワーク関連の問題を解決して、パケットリセット/再送信を排除できます。

関連項目

sys.dm_os_wait_statsのASYNC_NETWORK_IO