2

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

第一次,它会抛出一个异常:

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

堆栈跟踪

在 System.Data.SqlClient.SqlConnection.OnError(SqlException 异常,Boolean breakConnection)
在 System.Data.SqlClient.SqlInternalConnection.OnError(SqlException 异常,Boolean 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,字符串 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 方法, DbAsyncResult 结果)
在System.Data.SqlClient.SqlCommand.ExecuteReader(
CommandBehavior 行为,String 方法)的 System.Data.SqlClient.SqlCommand.ExecuteReader(CommandBehavior 行为,String 方法)的System.Data.SqlClient.SqlCommand.RunExecuteReader(CommandBehavior cmdBehavior,RunBehavior runBehavior,布尔 returnStream,String 方法)
( )

我用了

SELECT * 
FROM sys.dm_tran_session_transactions

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

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

4

1 回答 1

2

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

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

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

于 2012-07-26T09:55:49.863 回答