Risolvere i problemi relativi alle query lente risultanti da ASYNC_NETWORK_IO tipo di attesa
Sintomi
Quando SQL Server produce set di risultati e li invia a un'applicazione client inserendo i risultati in un buffer di output, l'applicazione client li recupera dal buffer di output. Se l'applicazione client si arresta o non recupera i risultati abbastanza velocemente, SQL Server deve attendere che l'applicazione client abbia ricevuto tutti i risultati prima di inviare altri risultati. Questa attesa verrà visualizzata come ASYNC_NETWORK_IO
. Per altre informazioni, vedere il video in Informazioni sulle attese ASYNC_NETWORK_IO in SQL Server.
Un numero eccessivo di attese ASYNC_NETWORK_IO può causare due problemi:
Le query potrebbero rallentare perché la durata totale sarà più lunga.
Quando SQL Server attende che il client recuperi i risultati, non può rilasciare i blocchi acquisiti. Se il blocco non viene rilasciato per molto tempo, le altre sessioni verranno bloccate in SQL Server.
Cause e soluzioni
Le sezioni seguenti elencano le cause comuni per questo tipo di attesa e i passaggi corrispondenti per risolvere il problema:
Set di risultati di grandi dimensioni
Alcuni client dell'applicazione richiedono migliaia o persino milioni di righe e quindi elaborano i risultati applicando filtri, ordinamento e aggregazioni. I set di risultati di grandi dimensioni possono causare un utilizzo della rete non necessario e l'elaborazione delle applicazioni client.
Soluzione: gli sviluppatori di applicazioni devono bilanciare attentamente l'elaborazione tra SQL Server e i client. I filtri o le aggregazioni possono essere eseguiti da SQL Server e il set di risultati finale può essere ridotto. Limitare il set di risultati che arriva ai client. Qualsiasi altro calcolo sui dati, la presentazione e la formattazione sono più appropriati sul lato client, una volta ricevuti i dati.
L'applicazione non recupera risultati abbastanza velocemente
Se l'applicazione client non recupera risultati abbastanza velocemente e non notifica a SQL Server che il set di risultati è stato ricevuto, l'attesa ASYNC_NETWORK_IO
si verificherà nel server.
Per illustrare l'uso di ADO.NET, per impostazione predefinita, DataSet e DataTable recupereranno tutte le righe fino al completamento prima che il client possa accedervi. Tuttavia, le classi come SqlDataReader consentono allo sviluppatore di applicazioni di scegliere cosa fare dopo che ogni riga viene recuperata dal server. Un'applicazione può recuperare una riga alla volta e quindi elaborare questa riga in base ai requisiti aziendali. Ad esempio:
Scrivere la riga in un file.
Inviare la riga a un'altra applicazione in rete.
Attendere un po' di tempo o per l'input dell'utente.
Soluzione: per risolvere il problema, recuperare tutti i risultati più velocemente possibile dal client usando un ciclo WHILE/FOR stretto. Ciò significa archiviare i risultati in memoria e quindi solo eseguire più elaborazione.
Il computer dell'applicazione client è sottoposto a stress (I/O, memoria o CPU)
Anche se il codice dell'applicazione viene sviluppato per recuperare i risultati il più velocemente possibile, i problemi relativi alle risorse di sistema possono causare un rallentamento dell'intero processo client. Ad esempio:
L'applicazione potrebbe non recuperare rapidamente i risultati se il computer che esegue l'applicazione client ha vincoli di risorse. Ad esempio:
Utilizzo del 100% della CPU
Memoria insufficiente (viene usata tutta la memoria)
I/O lento (ad esempio l'applicazione scrive i risultati o i log)
Questi vincoli di risorse possono causare un rallentamento dell'elaborazione dei risultati in ingresso e causare l'esperienza di SQL Server nel tipo di ASYNC_NETWORK_IO
attesa .
Soluzione: per risolvere questo problema, usare strumenti come Monitor prestazioni per diagnosticare il sistema che esegue l'applicazione e quindi eliminare eventuali vincoli di risorse. Uno dei metodi seguenti può funzionare per l'utente:
Arrestare l'esecuzione di altre applicazioni.
Risolvere eventuali problemi di codice in tali applicazioni.
Aggiornare l'hardware nel sistema se le applicazioni sono state ottimizzate completamente.
Scheda di interfaccia di rete/rete
Rete o schede di interfaccia di rete (NIC) lente possono causare ritardi nel traffico di rete e naturalmente ritardare il recupero dei risultati e la comunicazione con SQL Server. I ritardi di rete sono in genere causati dai problemi seguenti:
Problemi relativi al driver della scheda di rete
Problemi relativi ai driver di filtro di rete
Firewall non configurati correttamente o difettosi
Problemi relativi ai router
Reti in overload a causa del traffico (meno comune)
Risoluzione: per diagnosticare questi problemi, è possibile raccogliere una traccia di rete e cercare reimpostazioni e ritrasmissioni dei pacchetti. È quindi possibile risolvere il problema correlato alla rete per eliminare le reimpostazioni/ritrasmissioni dei pacchetti.