为什么简单选择中会出现超时
本文关键字:超时 简单选择 为什么 | 更新日期: 2023-09-27 18:31:25
我有一个使用SqlCommand.ExecuteReader()
从SQL Server 2008数据库中读取数据的应用程序。当我使用它时,我会得到一个TimeoutException
.CommandTimeout
设置为 40 秒 - 在异常发生之前也需要 40 秒。我还将IsolationLevel
设置为 ReadUncommitted
.当我直接在SQL Server Management Studio中执行查询时,它将快速执行(1s),没有任何问题。
查询相对简单:
select TOP (50) *
from ActivityView('de') a
where IsTrashed = 0 and
(Subject Like '%' and
(a.InchargeId = 'e9584e24-090a-4ef3-a048-330399bfb1b0' or a.PrivilegeLevelId in ('eb39d6bf-4904-4b8d-942f-39463c5d3c3f') or
(select top 1 Id from ActivityContact x where x.ActivityId = a.Id and x.UserId = '61423b82-bd6a-4381-808a-6df42f02ab59' ) is not null))
order by a.[Key] desc
当我执行这个时,我得到休耕异常:
at System.Data.SqlClient.SqlConnection.OnError(SqlException exception, Boolean breakConnection) at System.Data.SqlClient.SqlInternalConnection.OnError(SqlException exception, Boolean breakConnection) at System.Data.SqlClient.TdsParser.ThrowExceptionAndWarning() at System.Data.SqlClient.TdsParser.Run(RunBehavior runBehavior, SqlCommand cmdHandler, SqlDataReader dataStream, BulkCopySimpleResultSet bulkCopyHandler, TdsParserStateObject stateObj) at System.Data.SqlClient.SqlDataReader.SetMetaData(_SqlMetaDataSet metaData, Boolean moreInfo) at System.Data.SqlClient.TdsParser.Run(RunBehavior runBehavior, SqlCommand cmdHandler, SqlDataReader dataStream, BulkCopySimpleResultSet bulkCopyHandler, TdsParserStateObject stateObj) at System.Data.SqlClient.SqlDataReader.ConsumeMetaData() 在 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.ExecuteDbDataReader(CommandBehavior behavior) at System.Data.Common.DbCommand.System.Data.IDbCommand.ExecuteReader()
但是当我直接在SQL Server Management Studio中执行语句时,它运行良好,没有错误。
由于您有一个基于用户选择的过滤器构建的 SQL 命令,因此您需要根据这些选择生成更高效的 SQL 命令
因此,如果用户没有选择Subject
,请不要使用Subject Like '%'
只是不要将其包含在查询中。请记住,表中的任何记录都将与该条件匹配,并且 LIKE 运算符非常耗时
将这个想法(仅包含具有某些条件的筛选器)应用于命令可以具有的所有可能筛选器。
对我来说,超时异常的原因非常奇怪。
每次执行查询时,我都会创建并打开一个SqlConnection
。但是,我不会在查询结束时调用connection.Dispose()
(尽管我调用connection.Close()
)。当我重新启动 SQL Server 实例服务时,错误消失了,但在执行几次后,错误又回来了。
我在查询末尾添加了connection.Dispose()
,一切正常。