对超时SqlExceptions进行故障排除

时间:2008-09-16 20:48:30

标签: sql-server ado.net sqlexception

我有一些好奇的行为,我无法弄清楚为什么会发生。我看到间歇性的超时异常。我很确定它与音量有关,因为它在我们的开发环境中不可重复。作为一个bandaid解决方案,我尝试将sql命令超时提升到60秒,但正如我发现的那样,这似乎没有帮助。这是一个奇怪的部分,当我检查我的登录过程失败时,这里是开始和结束时间:

  • 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)

5 个答案:

答案 0 :(得分:3)

这可能听起来很愚蠢,但只是听我说。检查查询中涉及的所有索引和主键。它们存在吗?它们是否支离破碎?我有一个问题,所以有一些原因,直接运行脚本工作只是找到,但是当我通过应用程序执行它时,它很慢,因为污垢。读者基本上就像游标一样,因此索引非常重要。

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

答案 1 :(得分:3)

SQL命令超时,因为您使用的查询所花费的时间比执行时要长。在查询分析器或Management Studio中执行它,在数据库中使用代表性的数据量,并查看执行计划以找出什么是缓慢的。

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

答案 2 :(得分:0)

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

答案 3 :(得分:0)

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

答案 4 :(得分:0)

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