超时已过期。操作完成之前经过的超时时间或服务器没有响应

时间:2012-07-26 09:41:38

标签: sql wpf sql-server-2008 stored-procedures

我正在使用存储过程来检索记录并将其显示在网格中。

第一次,它会抛出异常:

  

超时已过期。操作完成之前经过的超时时间或服务器没有响应。

     

堆栈跟踪

     

at System.Data.SqlClient.SqlConnection.OnError(SqlException exception,Boolean breakConnection)
  在System.Data.SqlClient.SqlInternalConnection.OnError(SqlException异常,布尔breakConnection)
  在System.Data.SqlClient.TdsParser.ThrowExceptionAndWarning()
  在System.Data.SqlClient.TdsParser.Run(RunBehavior runBehavior,SqlCommand cmdHandler,SqlDataReader dataStream,BulkCopySimpleResultSet bulkCopyHandler,TdsParserStateObject stateObj)
  在System.Data.SqlClient.SqlDataReader.ConsumeMetaData()
  在System.Data.SqlClient.SqlDataReader.get_MetaData()
  在System.Data.SqlClient.SqlCommand.FinishExecuteReader(SqlDataReader ds,RunBehavior runBehavior,String resetOptionsString)
  在System.Data.SqlClient.SqlCommand.RunExecuteReaderTds(CommandBehavior cmdBehavior,RunBehavior runBehavior,Boolean returnStream,Boolean async)
  在System.Data.SqlClient.SqlCommand.RunExecuteReader(CommandBehavior cmdBehavior,RunBehavior runBehavior,Boolean returnStream,String method,DbAsyncResult result)
  在System.Data.SqlClient.SqlCommand.RunExecuteReader(CommandBehavior cmdBehavior,RunBehavior runBehavior,Boolean returnStream,String method)
  在System.Data.SqlClient.SqlCommand.ExecuteReader(CommandBehavior behavior,String method)
  在System.Data.SqlClient.SqlCommand.ExecuteReader()

我用过

SELECT * 
FROM sys.dm_tran_session_transactions

检查我的数据库中当前有多少活动事务,但我找不到。

第二次以后,这个存储过程运行完美(不会抛出超时异常)。可能是这种行为的原因是什么?

1 个答案:

答案 0 :(得分:2)

如果您的存储过程很复杂,或者您的数据库设计很差(例如缺少索引),则SQL Server可能无法提出最佳执行计划,并且可能无法评估所有选项因此它将评估尽可能多的,然后选择一些东西。所用时间可能超过您的超时限制。

第二次,你正在执行相同的存储过程,因此SQL Server可以保留它第一次完成的所有工作,并且能够在你再次出现之前完成对其选项的评估并返回数据

我有一个像这样的过程。如果重启我的服务器,第一次运行proc我总是会超时,但第二次总是有效。