待機の種類に起因する低速クエリ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 の使用を示すために、既定では、 DataSet と DataTable は、クライアントがアクセスする前にすべての行をフェッチして完了します。 ただし、 SqlDataReader などのクラスを使用すると、アプリケーション開発者は、サーバーから各行をフェッチした後の処理を選択できます。 アプリケーションは、一度に 1 行ずつフェッチし、ビジネス要件に従ってこの行を処理できます。 例えば次が挙げられます。
行をファイルに書き込みます。
ネットワーク経由で行を別のアプリケーションに送信します。
しばらく待つか、ユーザー入力を待ちます。
解決策: 問題を解決するには、タイトな WHILE/FOR ループを使用して、クライアントが実行できる限り速くすべての結果をフェッチします。 これは、結果をメモリに格納し、その後より多くの処理を行うことを意味します。
クライアント アプリケーション マシンがストレスを受けている (I/O、メモリ、または CPU)
結果をできるだけ速くフェッチするようにアプリケーション コードを開発した場合でも、システム リソースの問題により、クライアント プロセス全体が遅くなる可能性があります。 例えば次が挙げられます。
クライアント アプリケーションを実行するコンピューターにリソース制約がある場合、アプリケーションは結果をすばやくフェッチできない可能性があります。 例えば次が挙げられます。
100% の CPU 使用率
メモリ不足 (すべてのメモリが消費されます)
低速 I/O (アプリケーションが結果またはログを書き込む可能性があります)
これらのリソース制約により、受信結果の処理が遅くなり、SQL Server で待機の種類 ASYNC_NETWORK_IO
が発生する可能性があります。
解決策: この問題を解決するには、パフォーマンス モニターなどのツールを使用して、アプリケーションを実行するシステムを診断し、リソースの制約を排除します。 次のいずれかの方法が適しています。
他のアプリケーションの実行を停止します。
これらのアプリケーションのコードの問題を修正します。
アプリケーションが完全にチューニングされている場合は、システム上のハードウェアをアップグレードします。
NIC/ネットワーク
ネットワークやネットワーク インターフェイス カード (NIC) が遅いと、ネットワーク トラフィックに遅延が発生する可能性があり、結果のフェッチや SQL Server との通信も当然遅くなります。 ネットワークの遅延は通常、次の問題によって発生します。
ネットワーク アダプター ドライバーの問題
ネットワーク フィルター ドライバーの問題
ファイアウォールが正しく構成されていないか、障害が発生している
ルーターの問題
トラフィックによるネットワークの過負荷 (まれに発生)
解決策: これらの問題を診断するには、ネットワーク トレース 収集し パケット リセットと再送信を探します。 その後、ネットワーク関連の問題を解決して、パケットリセット/再送信を排除できます。