我正在使用存储过程来检索记录并将其显示在网格中。
第一次,它会抛出异常:
超时已过期。操作完成之前经过的超时时间或服务器没有响应。
堆栈跟踪
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
检查我的数据库中当前有多少活动事务,但我找不到。
第二次以后,这个存储过程运行完美(不会抛出超时异常)。可能是这种行为的原因是什么?
答案 0 :(得分:2)
如果您的存储过程很复杂,或者您的数据库设计很差(例如缺少索引),则SQL Server可能无法提出最佳执行计划,并且可能无法评估所有选项因此它将评估尽可能多的,然后选择一些东西。所用时间可能超过您的超时限制。
第二次,你正在执行相同的存储过程,因此SQL Server可以保留它第一次完成的所有工作,并且能够在你再次出现之前完成对其选项的评估并返回数据
我有一个像这样的过程。如果重启我的服务器,第一次运行proc我总是会超时,但第二次总是有效。