疑难解答超时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命令超时,因为您正在使用的查询需要比执行更长的时间。在查询分析器或管理工作室中执行它,,并在数据库中使用代表性的数据量,并查看执行计划以了解什么是缓慢的。
如果某些事情占用了很大一部分时间,并且被描述为“表扫描”或“聚集索引扫描”,请查看是否可以创建将该操作转换为密钥查找的索引(索引寻求或聚集索引寻找)。
答
尝试改变的SqlConnection的超时属性,而不是命令
答
这听起来很愚蠢,但只是听到我说出来。检查查询中涉及的所有索引和主键。它们存在吗?它们是分散的吗?我遇到了一个问题,出于某种原因,直接运行脚本才能找到,但是当我通过应用程序完成时,它的运行速度很慢。读者的行为基本上像游标一样,因此索引是非常重要的。
它可能不是这个,但它总是我检查的第一件事。
答
我曾经遇到过这个问题,并且我在其中一个数据库的视图中追踪了一些非常低效的SQL代码。有人将一个复杂的条件与一个子查询放在一个表连接的ON子句中,而不是放在它所属的WHERE子句中。一旦我纠正了这个错误,问题就消失了。
原来,我们只需要添加一个新的索引:-) – 2008-09-24 14:15:23