2008-09-16 16 views
3

J'ai un comportement curieux que j'ai du mal à comprendre pourquoi cela se produit. Je vois des exceptions de délai d'attente intermittent. Je suis sûr que c'est lié au volume parce que ce n'est pas reproductible dans notre environnement de développement. En tant que solution bandaid, j'ai essayé d'augmenter le délai d'attente de la commande sql à soixante secondes, mais comme je l'ai constaté, cela ne semble pas aider. Voici la partie étrange, quand je vérifie mes journaux sur le processus qui a échoué, voici les heures de début et de fin:Dépannage Timeout SqlExceptions

  • 09/16/2008 16:21:49
  • 09/16/2008 16 : 22: 19

Alors, comment cela pourrait-il être que le délai expire en trente secondes lorsque j'ai mis la commande timeout à soixante ??

Juste pour référence, voici l'exception d'être jeté:

System.Data.SqlClient.SqlException: Timeout expired. The timeout period elapsed prior to completion of the operation or the server is not responding. 
    at System.Data.SqlClient.SqlConnection.OnError(SqlException exception, Boolean breakConnection) 
    at System.Data.SqlClient.TdsParser.ThrowExceptionAndWarning(TdsParserStateObject stateObj) 
    at System.Data.SqlClient.TdsParser.Run(RunBehavior runBehavior, SqlCommand cmdHandler, SqlDataReader dataStream, BulkCopySimpleResultSet bulkCopyHandler, TdsParserStateObject stateObj) 
    at System.Data.SqlClient.SqlDataReader.ConsumeMetaData() 
    at System.Data.SqlClient.SqlDataReader.get_MetaData() 
    at System.Data.SqlClient.SqlCommand.FinishExecuteReader(SqlDataReader ds, RunBehavior runBehavior, String resetOptionsString) 
    at System.Data.SqlClient.SqlCommand.RunExecuteReaderTds(CommandBehavior cmdBehavior, RunBehavior runBehavior, Boolean returnStream, Boolean async) 
    at System.Data.SqlClient.SqlCommand.RunExecuteReader(CommandBehavior cmdBehavior, RunBehavior runBehavior, Boolean returnStream, String method, DbAsyncResult result) 
    at System.Data.SqlClient.SqlCommand.RunExecuteReader(CommandBehavior cmdBehavior, RunBehavior runBehavior, Boolean returnStream, String method) 
    at System.Data.SqlClient.SqlCommand.ExecuteReader(CommandBehavior behavior, String method) 
    at System.Data.SqlClient.SqlCommand.ExecuteReader() 
    at SetClear.DataAccess.SqlHelper.ExecuteReader(CommandType commandType, String commandText, SqlParameter[] commandArgs) 

Répondre

3

Les commandes SQL expirent car la requête que vous utilisez dure plus longtemps que celle à exécuter. Exécutez-le dans Query Analyzer ou Management Studio, avec une quantité représentative de données dans la base de données, et examinez le plan d'exécution pour savoir ce qui est lent. Si un élément prend un pourcentage important du temps et est décrit comme un "scan de table" ou un "index cluster", vérifiez si vous pouvez créer un index qui transformerait cette opération en une recherche de clé (un index recherche ou indexation en cluster).

+0

Il s'est avéré que nous avions juste besoin d'ajouter un nouvel index :-) –

0

Essayez de changer la propriété de délai d'attente du SqlConnection, plutôt que celle de la commande

0

Parce que le délai d'attente se produit sur la connexion, pas la commande . Vous devez définir la propriété connection.TimeOut

3

Cela peut sembler stupide, mais écoutez-moi. Vérifiez tous les index et les clés primaires impliqués dans votre requête. Est-ce qu'ils existent? Sont-ils fragmentés? J'ai eu un problème où, pour une raison quelconque, l'exécution du script fonctionnait tout simplement, mais quand je l'ai fait à travers l'application, c'était lent comme de la saleté. Le lecteur agit essentiellement comme des curseurs, donc l'indexation est extrêmement importante.

Ce n'est peut-être pas le cas, mais c'est toujours la première chose que je vérifie.

0

J'ai eu ce problème une fois, et je l'ai suivi à un code SQL vraiment inefficace dans une des vues de ma base de données. Quelqu'un a mis une condition complexe avec une sous-requête dans la clause ON pour une jointure de table, au lieu de dans la clause WHERE à laquelle elle appartenait. Une fois que j'ai corrigé cette erreur, le problème est parti.