疑难解答超时SqlExceptions

问题描述:

我有一些好奇的行为,我无法弄清楚为什么发生。我看到间歇性超时异常。我很确定它与音量有关,因为它在我们的开发环境中无法重现。作为一个bandaid解决方案,我尝试将sql命令超时设置为60秒,但正如我发现的,这似乎没有帮助。这里的怪一部分,当我检查发生故障的过程中我的日志,这里有开始和结束时间:疑难解答超时SqlExceptions

  • 09/16/2008 16点21分49秒
  • 09/16/2008 16 :22:19

那么,当我将命令超时设置为60分钟时,它会在30秒内超时?

仅供参考,这里是被抛出的异常:

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) 

SQL命令超时,因为您正在使用的查询需要比执行更长的时间。在查询分析器或管理工作室中执行它,,并在数据库中使用代表性的数据量,并查看执行计划以了解什么是缓慢的。

如果某些事情占用了很大一部分时间,并且被描述为“表扫描”或“聚集索引扫描”,请查看是否可以创建将该操作转换为密钥查找的索引(索引寻求或聚集索引寻找)。

+0

原来,我们只需要添加一个新的索引:-) – 2008-09-24 14:15:23

尝试改变的SqlConnection的超时属性,而不是命令

因为超时连接,而不是命令上发生的。你需要设置connection.TimeOut属性

这听起来很愚蠢,但只是听到我说出来。检查查询中涉及的所有索引和主键。它们存在吗?它们是分散的吗?我遇到了一个问题,出于某种原因,直接运行脚本才能找到,但是当我通过应用程序完成时,它的运行速度很慢。读者的行为基本上像游标一样,因此索引是非常重要的。

它可能不是这个,但它总是我检查的第一件事。

我曾经遇到过这个问题,并且我在其中一个数据库的视图中追踪了一些非常低效的SQL代码。有人将一个复杂的条件与一个子查询放在一个表连接的ON子句中,而不是放在它所属的WHERE子句中。一旦我纠正了这个错误,问题就消失了。