Nota
L'accesso a questa pagina richiede l'autorizzazione. È possibile provare ad accedere o modificare le directory.
L'accesso a questa pagina richiede l'autorizzazione. È possibile provare a modificare le directory.
Sommario
Un errore di timeout della query in SQL Server si verifica quando una query non restituisce dati prima della scadenza del timeout del comando dell'applicazione client. L'applicazione client annulla quindi la query e segnala "Timeout scaduto". Questo articolo spiega come verificare che si sia verificato un timeout della query (non un timeout della connessione), come identificare la query specifica correlando l'evento attention con sql_batch_completed gli eventi estesi e rpc_completed come impostare il timeout del comando in ADO.NET, ODBC, JDBC, OLE DB e ADO. La causa più comune è una query lenta, quindi la correzione consigliata consiste nell'ottimizzare la query anziché generare solo il valore di timeout. Usare questo articolo quando un'applicazione segnala errori di timeout mentre SQL Server registra gli eventi di attenzione (errore 3617) con una durata che corrisponde strettamente al timeout configurato.
Sintomi di un errore di timeout della query
Si supponga che un'applicazione eseponga dati da un database di SQL Server. Se la query non restituisce dati all'interno del valore di timeout configurato (in genere 30 secondi), l'applicazione annulla la query e genera uno di questi messaggi di errore:
-
Timeout. Il tempo disponibile è scaduto prima del completamento dell'operazione o il server non risponde. L'istruzione è stata interrotta.
-
System.Data.SqlClient.SqlException: Timeout scaduto. Il tempo disponibile è scaduto prima del completamento dell'operazione o il server non risponde.
Perché si verificano errori di timeout delle query
Questi errori si verificano sul lato applicazione. L'applicazione imposta un valore di timeout e, se viene raggiunto il timeout, annulla la query. Sul lato SQL Server, un annullamento di query dal lato client causa un evento Attention, errore 3617 (MSSQLSERVER_3617). Se il valore di timeout sul lato applicazione è impostato su 0 (nessun limite di tempo), il motore di database esegue la query fino al completamento, indipendentemente dalla durata, dai millisecondi o dai giorni.
Il valore di timeout viene impostato in modo diverso per ogni driver o API di accesso ai dati:
- In .NET Framework System.Data.SqlClient, è possibile impostare il valore di timeout nella proprietà CommandTimeout.
- In Microsoft. Data.SqlClient, il driver ADO.NET corrente per SQL Server, viene impostato sulla proprietà SqlCommand.CommandTimeout.
- Nell'API ODBC viene impostato tramite l'attributo
SQL_ATTR_QUERY_TIMEOUTnella funzione SQLSetStmtAttr . - Nell'API Java Database Connectivity (JDBC), si usa il metodo setQueryTimeout.
- In OLEDB viene impostata tramite la
DBPROP_COMMANDTIMEOUTproprietà nellaDBPROPstruttura . - In VBA (Excel), si usa la proprietà ADODB.Command.CommandTimeout.
Il timeout delle query è diverso da una proprietà di timeout della connessione. Quest'ultimo controlla il tempo di attesa di una connessione riuscita e non è coinvolto nell'esecuzione della query. Per altre informazioni, vedere Timeout delle query non uguale al timeout della connessione.
Passaggi per identificare e risolvere la query che si verifica il timeout
Il motivo più comune per i timeout delle query è la sottoperformità delle query. Ciò significa che la query viene eseguita più a lungo del valore di timeout della query predefinito. Velocizzare l'esecuzione della query per risolvere questo problema. Ecco come controllare le query:
Usare eventi estesi o traccia SQL per identificare le query che causano gli errori di timeout. È possibile tracciare l'evento di attenzione insieme agli
sql_batch_completedeventi estesi erpc_completede correlarli nello stessosession_idoggetto . Se si osserva che un evento completato viene immediatamente seguito da un evento di attenzione e la durata dell'evento completato corrisponde approssimativamente all'impostazione di timeout, è stata identificata la query. Ecco un esempio:Note
Nell'esempio la
SELECTquery viene eseguita per quasi 30 secondi e si arresta. L'evento di attenzione con lo stesso ID sessione indica che l'applicazione ha annullato la query.Nome Session_id Sql_text Durata (microsecondi) Timestamp: sql_batch_started 54 Selezionare … from Customers WHERE cid = 192937 NULL 2021-09-30 09:50:25.0000 sql_batch_completed 54 Selezionare … from Customers WHERE cid = 192937 29999981 2021-09-30 09:50:55.0000 Attenzione 54 Selezionare … from Customers WHERE cid = 192937 40000 2021-09-30 09:50:55.0400 Eseguire e testare le query in sqlcmd o in SQL Server Management Studio (SSMS).
Se le query sono lente anche in sqlcmd e SSMS, risolvere i problemi e migliorare le prestazioni delle query. Per informazioni dettagliate, vedere Risolvere i problemi relativi alle query a esecuzione lenta in SQL Server.
Note
In sqlcmd e SSMS il valore di timeout è impostato su 0 (nessun limite di tempo) ed è possibile testare ed esaminare le query.
Se le query sono veloci in sqlcmd e SSMS, ma sono lente sul lato applicazione, modificare le query in modo da usare le stesse opzioni SET usate in sqlcmd e SSMS. Confrontare le opzioni SET raccogliendo una traccia degli eventi estesi (account di accesso e connessione di eventi con
collect_options_text) e controllare laoptions_textcolonna . Ecco un esempio:ALTER EVENT SESSION [setOptions] ON SERVER ADD EVENT sqlserver.existing_connection(SET collect_options_text=(1) ACTION(package0.event_sequence,package0.last_error,sqlos.system_thread_id,sqlserver.context_info,sqlserver.session_id,sqlserver.sql_text)), ADD EVENT sqlserver.login(SET collect_options_text=(1) ACTION(sqlos.system_thread_id,sqlserver.context_info,sqlserver.sql_text))Per altre informazioni, vedere Risolvere i problemi di differenza delle prestazioni delle query tra l'applicazione di database e SSMS.
Controllare se l'impostazione
CommandTimeoutè inferiore alla durata della query prevista. Se l'impostazione dell'utente è corretta e si verificano ancora timeout, è a causa di un problema di prestazioni delle query. Ecco un esempio di codice ADO.NET con un valore di timeout impostato su 10 secondi:using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Threading.Tasks; using System.Data.SqlClient; using System.Data; namespace ConsoleApplication6 { class Program { static void Main() { string ConnectionString = @"Data Source=.\sql2019;Integrated Security=SSPI;Initial Catalog=tempdb;"; string queryString = "exec test"; using (SqlConnection connection = new SqlConnection(ConnectionString)) { connection.Open(); SqlCommand command = new SqlCommand(queryString, connection); // Setting command timeout to 10 seconds command.CommandTimeout = 10; //command.ExecuteNonQuery(); try { command.ExecuteNonQuery(); } catch (SqlException e) { Console.WriteLine("Got expected SqlException due to command timeout "); Console.WriteLine(e); } } } } }
Il timeout della query non è uguale al timeout della connessione
Un timeout della query è diverso da un timeout di connessione o un timeout di accesso. Il timeout della connessione o dell'account di accesso si verifica quando la connessione iniziale al server di database raggiunge un periodo di timeout predefinito. A questo punto, il client non ha inviato alcuna query al server. Questi messaggi sono esempi di errori di timeout della connessione o timeout di accesso:
-
Il timeout di connessione è scaduto. Il periodo di timeout è scaduto durante il tentativo di utilizzare il riconoscimento dell'handshake di pre-accesso. Ciò potrebbe verificarsi perché l'handshake di pre-accesso ha avuto esito negativo oppure il server non è stato in grado di rispondere in tempo. Il tempo impiegato nel tentativo di connettersi a questo server era [Pre-Login] initialization=23; handshake=14979;
-
Timeout. Il tempo disponibile è scaduto prima del completamento dell'operazione o il server non risponde. System.ComponentModel.Win32Exception (0x80004005): L'operazione di attesa è scaduta.
Il valore di timeout della connessione è un'impostazione lato client ed è in genere impostata su 15 secondi. Per altre informazioni su come risolvere i problemi di timeout della connessione, vedere Risolvere gli errori di timeout della connessione.
Contenuti correlati
- Video - timeout del comando SQL Server
- Timeout messaggi scaduti durante la connessione a SQL Server
- Risolvere i problemi relativi alle query a esecuzione lenta in SQL Server
- Risolvere i problemi di differenza delle prestazioni delle query tra l'applicazione di database e SSMS
- Understand e risolvere i problemi di blocco in SQL Server
- Risolvere i problemi relativi a una query che non termina mai in SQL Server
- Configurare l'opzione di configurazione del server remote query timeout