故障排除超时SqlExceptions

4

我遇到了一些奇怪的行为,我不知道原因是什么。我经常看到超时异常。我非常确定这与数据量有关,因为在我们的开发环境中无法重现问题。作为一个权宜之计,我尝试将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个回答

4

这可能听起来很愚蠢,但请听我说完。检查查询涉及的所有索引和主键。它们是否存在?它们是否碎片化?我曾遇到过一个问题,某种原因下,直接运行脚本效果很好,但是通过应用程序运行时却非常慢。读取器基本上像游标,因此索引非常重要。

也许不是这个问题,但这总是我首先检查的事情。


4

SQL命令超时是因为您使用的查询所需的时间比执行时间长。在Query Analyzer或Management Studio中执行它,使用数据库中代表性的数据,并查看执行计划以找出慢的原因。

如果某个操作占用了大量时间,并被描述为“表扫描”或“聚集索引扫描”,请考虑是否可以创建一个索引,将该操作转换为键查找(索引搜索或聚集索引搜索)。


结果证明我们只需要添加一个新索引就可以了 :-) - Joel Martinez

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

1

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


1
我曾经遇到过这个问题,最后发现是数据库视图中的一些效率低下的 SQL 代码导致的。有人将一个复杂的条件和子查询放在了表连接的 ON 子句中,而不是应该放在 WHERE 子句中。一旦我纠正了这个错误,问题就解决了。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接