Freigeben über


Problembehandlung für langsame Abfragen, die aus ASYNC_NETWORK_IO Wartetyp resultieren

Problembeschreibung

Wenn SQL Server Resultsets erzeugt und an eine Clientanwendung sendet, indem die Ergebnisse in einen Ausgabepuffer versetzt werden, ruft die Clientanwendung sie aus dem Ausgabepuffer ab. Wenn die Clientanwendung beendet wird oder die Ergebnisse nicht schnell genug abruft, muss SQL Server auf die Bestätigung warten, dass die Clientanwendung alle Ergebnisse erhalten hat, bevor weitere Ergebnisse gesendet werden. Diese Wartezeit wird angezeigt als ASYNC_NETWORK_IO. Weitere Informationen finden Sie im Video unter Understanding ASYNC_NETWORK_IO Waits in SQL Server.

Übermäßige ASYNC_NETWORK_IO Wartezeiten können zwei Probleme verursachen:

  • Abfragen verlangsamen sich möglicherweise, da ihre Gesamtdauer länger ist.

  • Wenn SQL Server wartet, bis der Client Ergebnisse abruft, kann es keine Sperren freigeben. Wenn die Sperre über einen langen Zeitraum nicht freigegeben 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 dann die Ergebnisse durch Anwenden von Filtern, Sortieren und Aggregationen. Große Resultsets können zu unnötiger Netzwerkauslastung und Clientanwendungsverarbeitung führen.

Lösung: Anwendungsentwickler müssen die Verarbeitung zwischen SQL Server und Clients sorgfältig ausgleichen. 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 an die Clients gelangt. Alle weiteren Berechnungen über die Daten, die Präsentation und die Formatierung sind auf der Clientseite besser geeignet, sobald die Daten empfangen wurden.

Die Anwendung ruft nicht schnell genug Ergebnisse ab.

Wenn die Clientanwendung nicht schnell genug Ergebnisse abruft und SQL Server nicht darüber benachrichtigt, dass das Resultset empfangen wurde, tritt die ASYNC_NETWORK_IO Wartezeit auf dem Server auf.

Um die Verwendung von ADO.NET zu veranschaulichen, ruft 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 jeder Zeile vom Server ausgeführt werden soll. Eine Anwendung kann jeweils eine Zeile abrufen und diese Zeile dann gemäß den Geschäftlichen Anforderungen verarbeiten. Zum Beispiel:

  • Schreiben Sie die Zeile in eine Datei.

  • Senden Sie die Zeile an eine andere Anwendung über das Netzwerk.

  • Warten Sie einige Zeit oder auf Benutzereingaben.

Lösung: Um das Problem zu beheben, rufen Sie alle Ergebnisse so schnell wie der Client mithilfe einer engen WHILE/FOR-Schleife ab. Dies bedeutet, dass die Ergebnisse im Arbeitsspeicher gespeichert werden und dann nur mehr Verarbeitung ausgeführt wird.

Clientanwendungscomputer ist unter Stress (E/A, Arbeitsspeicher oder CPU)

Selbst wenn Anwendungscode so schnell wie möglich entwickelt wird, können Systemressourcenprobleme dazu führen, dass der gesamte Clientprozess langsam ist. Zum Beispiel:

Die Anwendung ruft möglicherweise keine Ergebnisse schnell ab, wenn der Computer, auf dem die Clientanwendung ausgeführt wird, Ressourceneinschränkungen aufweist. Zum Beispiel:

  • CPU-Auslastung von 100 Prozent

  • Nicht genügend Arbeitsspeicher (der gesamte Arbeitsspeicher wird verbraucht)

  • Langsame E/A (vielleicht 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_IOerlebt.

Lösung: Um dieses Problem zu beheben, verwenden Sie Tools wie Leistungsmonitor, um das System zu diagnostizieren, das die Anwendung ausführt, und entfernen Sie dann alle Ressourceneinschränkungen. Eine der folgenden Methoden kann für Sie funktionieren:

  • Beenden Sie die Ausführung anderer Anwendungen.

  • Beheben Sie codeprobleme in diesen Anwendungen.

  • Aktualisieren Sie die Hardware auf dem System, wenn die Anwendungen vollständig abgestimmt wurden.

NIC/Netzwerk

Langsame Netzwerk- oder Netzwerkschnittstellenkarten (Network Interface Cards, NIC) können zu Verzögerungen im Netzwerkdatenverkehr führen 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:

  • Treiberprobleme des Netzwerkadapters

  • Probleme mit Netzwerkfiltertreibern

  • Falsch konfigurierte oder fehlerhafte Firewalls

  • Routerprobleme

  • Überlastete Netzwerke aufgrund von Datenverkehr (weniger häufig)

Lösung: Um diese Probleme zu diagnostizieren, können Sie eine Netzwerkablaufverfolgung sammeln und nach Paketzurücksetzungen und Erneutübertragungen suchen. Anschließend können Sie das netzwerkbezogene Problem beheben, um Paketzurücksetzungen/Neuübertragungen zu beseitigen.

Siehe auch

ASYNC_NETWORK_IO in sys.dm_os_wait_stats