Episodio

Timeout dei comandi di SQL Server - Timeout dell'applicazione - Attenzione agli eventi estesi

Quando si usa ODBC o SqlClient per accedere ai dati da SQL Server, per impostazione predefinita la query verrà annullata se non è presente alcuna risposta dal server entro un determinato periodo di tempo (30 secondi per impostazione predefinita). ODBC o SqlClient avvierà un timer dopo l'invio della query a SQL Server e, se non sono presenti risultati dal server entro 30 secondi, la query verrà annullata e all'applicazione verrà inviato un messaggio di errore di timeout. Nel caso in cui un pacchetto di rete (contenente i risultati della query) sia stato ricevuto entro i 30 secondi e se si prevede pacchetti di rete aggiuntivi (righe aggiuntive che non potevano rientrare nel primo pacchetto di rete), il timer viene riavviato, se il pacchetto di rete successivo non viene ricevuto entro questo periodo di 30 secondi, la query verrà annullata.

I motivi comuni per il timeout dei comandi SQL sono uno schema non ottimale o query inefficienti eseguite per un lungo periodo di tempo o che non riescono ad indici o problemi di attesa di blocco. È importante ottimizzare le query anziché aumentare le impostazioni di timeout del comando SQL.

Nel video viene illustrato un esempio in cui la riduzione delle dimensioni dei pacchetti di rete elimina il timeout, questa dimostrazione consiste nel comprendere come i pacchetti di rete sono coinvolti nel reimpostare il timer e per sviluppare una migliore comprensione del timeout. La modifica delle dimensioni dei pacchetti di rete non è una soluzione per evitare il timeout, l'ottimizzazione di uno schema non ottimale o l'aggiunta di indici o l'evitare attese di blocco sono la soluzione appropriata.

Per identificare il comando che porta all'errore di timeout del comando SQL, è possibile usare eventi estesi e monitorare l'evento "sqlserver.attention". Lo script di eventi esteso usato nel video è disponibile in www.sqlvideo.com/xevents.

In SQL Server Management Studio il timeout del comando SQL può essere modificato usando "Opzioni" nella finestra di dialogo di connessione. Per impostazione predefinita, questa opzione è impostata su '0', ovvero nessun timeout. Quando si esegue una query o una stored procedure, se si fa clic sul pulsante "Annulla" (il quadrato rosso), verrà inviata la stessa attenzione a SQL Server (ad esempio sql Command Timeout). E questo genererà a sua volta l'evento "sqlserver.attention" negli eventi estesi.

Nel video seguente è possibile vedere un esempio di timeout del comando SQL. Lo strumento SQLTest simula i lab pratici, senza alcuna registrazione necessaria. È possibile praticare l'esempio pratico online durante la visione del video.