Episodio

timeout del comando 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 prevediamo 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 più comuni per SQL timeout dei comandi sono query non ottimali o non ottimali eseguite per un lungo periodo di tempo o che causano errori di attesa di blocco o indici mancanti. È 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 nella reimpostazione del 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 dello schema non ottimale o l'aggiunta di indici o l'aggiunta di indici o l'evitare attese di blocco sono la soluzione appropriata.

Per identificare il comando che porta a SQL errore di timeout del comando, è possibile usare eventi estesi e monitorare l'evento "sqlserver.attention". Lo script di evento 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 una query o una stored procedure è in esecuzione, se si fa clic sul pulsante "Annulla" (il quadrato rosso), la stessa attenzione verrà inviata alla SQL Server (ad esempio SQL timeout comando). Verrà generato a sua volta l'evento "sqlserver.attention" negli eventi estesi.

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