4

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

  • 2008 年 9 月 16 日 16:21:49
  • 2008 年 9 月 16 日 16:22:19

那么当我将命令超时设置为六十时,它怎么会在三十秒内超时?

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

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

5 回答 5

4

这听起来可能很愚蠢,但请听我说完。检查查询中涉及的所有索引和主键。它们存在吗?它们是碎片化的吗?我遇到了一个问题,出于某种原因,直接运行脚本只是找到了,但是当我通过应用程序执行此操作时,它就像泥土一样慢。阅读器基本上就像游标一样,所以索引非常重要。

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

于 2008-09-16T20:53:19.680 回答
4

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

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

于 2008-09-17T00:39:03.523 回答
1

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

于 2008-09-16T20:50:24.103 回答
1

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

于 2008-09-16T20:51:06.037 回答
1

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

于 2008-09-16T20:58:00.403 回答