对超时SqlExceptions进行故障排除
时间:2020-03-05 18:57:09 来源:igfitidea点击:
我有一些奇怪的行为,无法找出原因。我看到间歇性超时异常。我很确定它与数量有关,因为它在我们的开发环境中是不可复制的。作为一个临时的解决方案,我尝试将sql命令超时提高到60秒,但是正如我发现的那样,这似乎无济于事。这是奇怪的部分,当我检查失败的进程的日志时,这是开始时间和结束时间:
- 09/16/2008 16:21:49
- 09/16/2008 16:22:19
那么当我将命令超时设置为60时,怎么可能在三十秒内超时呢?
仅供参考,以下是抛出的异常:
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)
解决方案
回答
尝试更改SqlConnection的timeout属性,而不是命令的属性
回答
因为超时发生在连接上,而不是命令上。我们需要设置connection.TimeOut属性
回答
这听起来可能很愚蠢,但请听我说出来。检查查询中涉及的所有索引和主键。它们存在吗?他们支离破碎吗?我遇到了一个问题,在某种程度上,找到某种原因完全可以运行该脚本,但是后来当我通过该应用程序进行操作时,它变慢了。读者的行为基本上像光标一样,因此索引非常重要。
可能不是这样,但这始终是我检查的第一件事。
回答
我曾经遇到过这个问题,并且在我的数据库视图之一中将其跟踪到了一些效率很低的SQL代码。有人将带有子查询的复杂条件放入表联接的ON子句中,而不是放入它所属的WHERE子句中。一旦纠正了该错误,问题就消失了。
回答
SQL命令超时是因为我们使用的查询所花的时间比执行查询所花的时间长。在Query Analyzer或者Management Studio中执行它,并在数据库中存储大量数据,然后查看执行计划以找出运行缓慢的原因。
如果某件事花费大量时间,并被描述为"表扫描"或者"聚集索引扫描",请查看是否可以创建将该操作转变为键查找的索引(索引查找或者聚集索引)寻找)。