Problembehandlung bei langsamen Abfragen, die sich aus ASYNC_NETWORK_IO Wartetyp ergeben
Symptome
Wenn SQL Server Resultsets erzeugt und an eine Clientanwendung sendet, indem die Ergebnisse in einem Ausgabepuffer gespeichert werden, ruft die Clientanwendung diese aus dem Ausgabepuffer ab. Wenn die Clientanwendung beendet oder die Ergebnisse nicht schnell genug abruft, muss SQL Server auf die Bestätigung warten, dass die Clientanwendung alle Ergebnisse empfangen hat, bevor weitere Ergebnisse gesendet werden. Diese Wartezeit wird als ASYNC_NETWORK_IO
angezeigt. Weitere Informationen finden Sie im Video unter Grundlegendes zu ASYNC_NETWORK_IO Waits in SQL Server.
Übermäßige ASYNC_NETWORK_IO Wartezeiten können zwei Probleme verursachen:
Abfragen können sich verlangsamen, da ihre Gesamtdauer länger ist.
Wenn SQL Server wartet, bis der Client Ergebnisse abruft, kann er keine erworbenen Sperren freigeben. Wenn die Sperre für längere Zeit nicht aufgehoben wird, werden andere Sitzungen auf SQL Server blockiert.
Ursachen und Lösungen
In den folgenden Abschnitten werden die häufigsten Ursachen für diesen Wartetyp und die entsprechenden Schritte zum Beheben des Problems aufgeführt:
Großes Resultset
Einige Anwendungsclients fordern Tausende oder sogar Millionen von Zeilen an und verarbeiten die Ergebnisse dann durch Anwenden von Filtern, Sortierungen und Aggregationen. Große Resultsets können zu einer unnötigen Netzwerkauslastung und Clientanwendungsverarbeitung führen.
Auflösung: Anwendungsentwickler müssen die Verarbeitung zwischen SQL Server und Clients sorgfältig abwägen. Filterung oder Aggregationen können von SQL Server ausgeführt werden, und das endgültige Resultset kann klein sein. Beschränken Sie das Resultset, das bei den Clients eingeht. Alle weiteren Berechnungen für die Daten, Die Darstellung und Formatierung sind auf der Clientseite besser geeignet, sobald die Daten empfangen wurden.
Die Anwendung ruft Ergebnisse nicht schnell genug ab
Wenn die Clientanwendung Ergebnisse nicht schnell genug abruft und SQL Server nicht benachrichtigt, dass das Resultset empfangen wurde, tritt die ASYNC_NETWORK_IO
Wartezeit auf dem Server auf.
Um die Verwendung von ADO.NET zu veranschaulichen, rufen DataSet und DataTable standardmäßig alle Zeilen bis zum Abschluss ab, bevor der Client darauf zugreifen kann. Klassen wie SqlDataReader ermöglichen es dem Anwendungsentwickler jedoch, auszuwählen, was nach dem Abrufen der einzelnen Zeilen vom Server zu tun ist. Eine Anwendung kann jeweils eine Zeile abrufen und diese Zeile dann gemäß den Geschäftsanforderungen verarbeiten. Zum Beispiel:
Schreiben Sie die Zeile in eine Datei.
Senden Sie die Zeile über das Netzwerk an eine andere Anwendung.
Warten Sie einige Zeit oder auf Benutzereingaben.
Auflösung: Um das Problem zu beheben, rufen Sie alle Ergebnisse so schnell wie möglich ab, indem Sie eine enge WHILE/FOR-Schleife verwenden. Das bedeutet, dass Ergebnisse im Arbeitsspeicher gespeichert werden und erst dann mehr Verarbeitung ausgeführt wird.
Der Clientanwendungscomputer ist unter Belastung (E/A, Arbeitsspeicher oder CPU)
Selbst wenn Anwendungscode so entwickelt wurde, dass ergebnisse so schnell wie möglich abgerufen werden, können Probleme mit Systemressourcen dazu führen, dass der gesamte Clientprozess langsam ist. Zum Beispiel:
Die Anwendung ruft möglicherweise nicht schnell Ergebnisse ab, wenn der Computer, auf dem die Clientanwendung ausgeführt wird, Ressourceneinschränkungen aufweist. Zum Beispiel:
100 % CPU-Auslastung
Unzureichender Arbeitsspeicher (der gesamte Arbeitsspeicher wird verbraucht)
Langsame E/A (möglicherweise schreibt die Anwendung Ergebnisse oder Protokolle)
Diese Ressourceneinschränkungen können zu einer langsamen Verarbeitung eingehender Ergebnisse führen und dazu führen, dass SQL Server den Wartetyp ASYNC_NETWORK_IO
aufweist.
Auflösung: Um dieses Problem zu beheben, verwenden Sie Tools wie Leistungsmonitor, um das System zu diagnostizieren, auf dem die Anwendung ausgeführt wird, und beseitigen Sie dann alle Ressourceneinschränkungen. Eine der folgenden Methoden kann für Sie funktionieren:
Beenden Sie die Ausführung anderer Anwendungen.
Beheben Sie alle Codeprobleme in diesen Anwendungen.
Aktualisieren Sie die Hardware auf dem System, wenn die Anwendungen vollständig optimiert wurden.
NIC/Netzwerk
Langsame Netzwerk- oder Netzwerkschnittstellenkarten (NIC) können Verzögerungen im Netzwerkdatenverkehr verursachen und das Abrufen der Ergebnisse und die Kommunikation mit SQL Server natürlich verzögern. Netzwerkverzögerungen werden in der Regel durch die folgenden Probleme verursacht:
Probleme mit dem Netzwerkadaptertreiber
Probleme mit Netzwerkfiltertreibern
Falsch konfigurierte oder fehlerhafte Firewalls
Routerprobleme
Überlastete Netzwerke aufgrund von Datenverkehr (weniger häufig)
Auflösung: Um diese Probleme zu diagnostizieren, können Sie eine Netzwerkablaufverfolgung erfassen und nach Paketzurücksetzungen und Neuübertragungen suchen. Anschließend können Sie das netzwerkbezogene Problem beheben, um Paketzurücksetzungen/Neuübertragungen zu vermeiden.