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 il riconoscimento 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.
Attese ASYNC_NETWORK_IO eccessive possono 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 risoluzioni
Le sezioni seguenti elencano le cause comuni di 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 addirittura milioni di righe e quindi elaborano i risultati applicando filtri, ordinamento e aggregazioni. Set di risultati di grandi dimensioni possono causare un utilizzo di rete non necessario e l'elaborazione dell'applicazione client.
Risoluzione: Gli sviluppatori di applicazioni devono bilanciare attentamente l'elaborazione tra SQL Server e 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. Eventuali ulteriori calcoli sui dati, la presentazione e la formattazione sono più appropriati sul lato client, una volta ricevuti i dati.
L'applicazione non recupera i risultati abbastanza velocemente
Se l'applicazione client non recupera i risultati abbastanza velocemente e non notifica 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 al completamento prima che il client possa accedervi. Tuttavia, classi come SqlDataReader consentono allo sviluppatore dell'applicazione di scegliere le operazioni da eseguire dopo il recupero di ogni riga dal server. Un'applicazione può recuperare una riga alla volta ed 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.
Risoluzione: Per risolvere il problema, recuperare tutti i risultati il più velocemente possibile usando un ciclo WHILE/FOR stretto. Ciò significa che l'archiviazione dei risultati viene eseguita in memoria e solo in seguito viene eseguita una maggiore 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 delle 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 della CPU al 100%
Memoria insufficiente (viene usata tutta la memoria)
I/O lento (ad esempio, l'applicazione scrive risultati o log)
Questi vincoli di risorse possono causare una lenta elaborazione dei risultati in ingresso e causare SQL Server di sperimentare il tipo di ASYNC_NETWORK_IO
attesa .
Risoluzione: 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
Le schede di interfaccia di rete o di rete lente possono causare ritardi nel traffico di rete e ritardare naturalmente 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 del filtro di rete
Firewall non configurati correttamente o difettosi
Problemi dei 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 di pacchetti. È quindi possibile risolvere il problema correlato alla rete per eliminare le reimpostazioni/ritrasmissioni dei pacchetti.