Delen via


Problemen met trage query's oplossen die het gevolg zijn van ASYNC_NETWORK_IO wachttype

Symptomen

Wanneer SQL Server resultatensets produceert en naar een clienttoepassing verzendt door de resultaten in een uitvoerbuffer te plaatsen, haalt de clienttoepassing deze op uit de uitvoerbuffer. Als de clienttoepassing stopt of de resultaten niet snel genoeg ophaalt, moet SQL Server wachten op bevestiging dat de clienttoepassing alle resultaten heeft ontvangen voordat er meer resultaten worden verzonden. Deze wachttijd wordt weergegeven als ASYNC_NETWORK_IO. Zie de video bij Understanding ASYNC_NETWORK_IO Waits in SQL Server voor meer informatie.

Overmatige ASYNC_NETWORK_IO wachttijden kunnen twee problemen veroorzaken:

  • Query's kunnen vertragen omdat de totale duur langer is.

  • Wanneer SQL Server wacht totdat de client resultaten heeft opgehaald, kunnen er geen verkregen vergrendelingen worden vrijgegeven. Als de vergrendeling gedurende lange tijd niet wordt vrijgegeven, worden andere sessies geblokkeerd op SQL Server.

Oorzaken en oplossingen

De volgende secties bevatten de veelvoorkomende oorzaken voor dit wachttype en de bijbehorende stappen om het probleem op te lossen:

Grote resultatenset

Sommige toepassingsclients vragen duizenden of zelfs miljoenen rijen aan en verwerken vervolgens de resultaten door filters, sortering en aggregaties toe te passen. Grote resultatensets kunnen leiden tot onnodig netwerkgebruik en verwerking van clienttoepassingen.

Oplossing: Toepassingsontwikkelaars moeten de verwerking tussen SQL Server en clients zorgvuldig verdelen. Filteren of aggregaties kunnen worden uitgevoerd door SQL Server en de uiteindelijke resultatenset kan klein zijn. Beperk de resultatenset die bij de clients aankomt. Alle berekeningen over de gegevens, presentatie en opmaak zijn meer geschikt aan de clientzijde, zodra de gegevens zijn ontvangen.

De toepassing haalt niet snel genoeg resultaten op

Als de clienttoepassing niet snel genoeg resultaten ophaalt en SQL Server niet informeert dat de resultatenset is ontvangen, wordt de ASYNC_NETWORK_IO wachttijd op de server uitgevoerd.

Ter illustratie van het gebruik van ADO.NET haalt DataSet en DataTable standaard alle rijen op die zijn voltooid voordat de client er toegang toe heeft. Met klassen zoals SqlDataReader kan de toepassingsontwikkelaar echter kiezen wat er moet worden uitgevoerd nadat elke rij van de server is opgehaald. Een toepassing kan één rij tegelijk ophalen en deze rij vervolgens verwerken volgens de bedrijfsvereisten. Bijvoorbeeld:

  • Schrijf de rij naar een bestand.

  • Verzend de rij naar een andere toepassing via het netwerk.

  • Wacht enige tijd of op gebruikersinvoer.

Oplossing: Om het probleem op te lossen, haalt u alle resultaten zo snel mogelijk op met behulp van een strakke WHILE/FOR-lus. Dat betekent dat het opslaan van resultaten in het geheugen en alleen dan meer verwerking uitvoert.

Clienttoepassingscomputer is onder stress (I/O, geheugen of CPU)

Zelfs als toepassingscode zo snel mogelijk is ontwikkeld om resultaten op te halen, kunnen systeemresourceproblemen ertoe leiden dat het hele clientproces traag is. Bijvoorbeeld:

De toepassing haalt mogelijk niet snel resultaten op als de computer waarop de clienttoepassing wordt uitgevoerd resourcebeperkingen heeft. Bijvoorbeeld:

  • 100% CPU-gebruik

  • Onvoldoende geheugen (al het geheugen wordt verbruikt)

  • Trage I/O (mogelijk schrijft de toepassing resultaten of logboeken)

Deze resourcebeperkingen kunnen leiden tot trage verwerking van binnenkomende resultaten en ertoe leiden dat SQL Server wachttype ASYNC_NETWORK_IOondervindt.

Oplossing: Als u dit probleem wilt oplossen, gebruikt u hulpprogramma's zoals Performance Monitor om het systeem te diagnosticeren waarop de toepassing wordt uitgevoerd, en elimineert u vervolgens resourcebeperkingen. Een van de volgende methoden werkt mogelijk voor u:

  • Voorkomen dat andere toepassingen worden uitgevoerd.

  • Los eventuele codeproblemen in deze toepassingen op.

  • Werk de hardware op het systeem bij als de toepassingen volledig zijn afgestemd.

NIC/netwerk

Een traag netwerk of trage NIC's (netwerkinterfacekaarten) kunnen vertragingen in het netwerkverkeer veroorzaken en zorgen voor vertraging in het ophalen van resultaten en de communicatie met SQL Server. Netwerkvertragingen worden meestal veroorzaakt door de volgende problemen:

  • Problemen met stuurprogramma's voor netwerkadapters

  • Problemen met stuurprogramma's voor netwerkfilters

  • Onjuist geconfigureerde of defecte firewalls

  • Problemen met routers

  • Overbelaste netwerken ten gevolge van verkeer (minder gebruikelijk)

Oplossing: Om deze problemen vast te stellen, kunt u een netwerktracering verzamelen en zoeken naar pakketherstel en opnieuw verzenden. Vervolgens kunt u het probleem met betrekking tot het netwerk oplossen om het opnieuw instellen/opnieuw verzenden van pakketten te elimineren.

Zie ook

ASYNC_NETWORK_IO in sys.dm_os_wait_stats