Dela via


Felsöka långsamma frågor som beror på ASYNC_NETWORK_IO väntetyp

Symptom

När SQL Server skapar resultatuppsättningar och skickar dem till ett klientprogram genom att placera resultatet i en utdatabuffert hämtar klientprogrammet dem från utdatabufferten. Om klientprogrammet stoppar eller inte hämtar resultaten tillräckligt snabbt måste SQL Server vänta på bekräftelse av att klientprogrammet har tagit emot alla resultat innan fler resultat skickas. Den här väntan visas som ASYNC_NETWORK_IO. Mer information finns i videon i Understanding ASYNC_NETWORK_IO Waits in SQL Server (Förstå ASYNC_NETWORK_IO väntetider i SQL Server).

För många ASYNC_NETWORK_IO väntetider kan orsaka två problem:

  • Frågor kan bli långsammare eftersom deras totala varaktighet blir längre.

  • När SQL Server väntar på att klienten ska hämta resultat kan den inte frigöra lås som hämtats. Om låset inte släpps på länge blockeras andra sessioner på SQL Server.

Orsaker och lösningar

I följande avsnitt visas vanliga orsaker till den här väntetypen och motsvarande steg för att lösa problemet:

Stor resultatuppsättning

Vissa programklienter begär tusentals eller till och med miljontals rader och bearbetar sedan resultaten genom att tillämpa filter, sortering och aggregeringar. Stora resultatuppsättningar kan leda till onödig nätverksanvändning och bearbetning av klientprogram.

Upplösning: Programutvecklare måste noggrant balansera bearbetningen mellan SQL Server och klienter. Filtrering eller sammansättningar kan utföras av SQL Server och den slutliga resultatuppsättningen kan vara liten. Begränsa den resultatuppsättning som kommer till klienterna. Alla fler beräkningar över data, presentation och formatering är lämpligare på klientsidan när data har tagits emot.

Programmet hämtar inte resultat tillräckligt snabbt

Om klientprogrammet inte hämtar resultat tillräckligt snabbt och inte meddelar SQL Server att resultatuppsättningen har tagits emot ASYNC_NETWORK_IO sker väntan på servern.

För att illustrera användningen av ADO.NET hämtar DataSet och DataTable som standard alla rader innan klienten kan komma åt den. Klasser som SqlDataReader gör det dock möjligt för programutvecklaren att välja vad de ska göra när varje rad hämtas från servern. Ett program kan hämta en rad i taget och sedan bearbeta den här raden enligt affärskraven. Till exempel:

  • Skriv raden till en fil.

  • Skicka raden till ett annat program via nätverket.

  • Vänta en stund eller på användarindata.

Upplösning: Lös problemet genom att hämta alla resultat så snabbt som klienten kan med hjälp av en nära WHILE/FOR-loop. Det innebär att lagra resultat i minnet och först därefter utföra mer bearbetning.

Klientprogramdatorn är hårt belastad (I/O, minne eller CPU)

Även om programkoden utvecklas för att hämta resultat så snabbt som möjligt kan problem med systemresurser göra att hela klientprocessen blir långsam. Till exempel:

Programmet kanske inte snabbt hämtar resultat om den dator som kör klientprogrammet har resursbegränsningar. Till exempel:

  • 100 % processoranvändning

  • Otillräckligt minne (allt minne förbrukas)

  • Långsam I/O (kanske programmet skriver resultat eller loggar)

Dessa resursbegränsningar kan leda till långsam bearbetning av inkommande resultat och orsaka att SQL Server upplever väntetyp ASYNC_NETWORK_IO.

Upplösning: Lös problemet genom att använda verktyg som Prestandaövervakaren för att diagnostisera systemet som kör programmet och sedan eliminera eventuella resursbegränsningar. En av följande metoder kan fungera för dig:

  • Stoppa andra program från att köras.

  • Åtgärda eventuella kodproblem i dessa program.

  • Uppgradera maskinvaran i systemet om programmen har finjusterats helt.

Nätverkskort/nätverk

Långsamma nätverks- eller nätverkskort (NIC) kan orsaka fördröjningar i nätverkstrafiken och fördröjer naturligtvis hämtningen av resultaten och kommunikationen med SQL Server. Nätverksfördröjningar orsakas vanligtvis av följande problem:

  • Problem med drivrutin för nätverkskort

  • Problem med nätverksfilterdrivrutiner

  • Felkonfigurerade eller felaktiga brandväggar

  • Problem med routrar

  • Överbelastade nätverk på grund av trafik (mindre vanligt)

Upplösning: För att diagnostisera dessa problem kan du samla in en nätverksspårning och leta efter paketåterställningar och återöverföringar. Du kan sedan lösa det nätverksrelaterade problemet för att eliminera paketåterställningar/återöverföringar.

Se även

ASYNC_NETWORK_IO i sys.dm_os_wait_stats