c# - 为什么简单的select会超时

标签 c# sql sql-server sqlexception

我有一个应用程序使用 SqlCommand.ExecuteReader() 从 SQL Server 2008 数据库中读取数据。当我使用它时,我会得到一个TimeoutExceptionCommandTimeout 设置为 40 秒 - 异常发生也需要 40 秒。我还将 IsolationLevel 设置为 ReadUncommitted。 当我直接在 SQL Server Management Studio 中执行查询时,它会执行得很快(1 秒),没有任何问题。

查询比较简单:

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()
   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.ExecuteDbDataReader(CommandBehavior behavior)
   at System.Data.Common.DbCommand.System.Data.IDbCommand.ExecuteReader()

但是当我直接在 SQL Server Management Studio 中执行语句时,它运行完美,没有错误。

最佳答案

由于您的 SQL 命令是根据用户选择的过滤器构建的,因此您需要根据这些选择生成更高效的 SQL 命令

因此,如果用户没有选择 Subject,则不要使用 Subject Like '%',也不要在查询中包含它。请记住,表中的任何记录都将匹配该条件,并且 LIKE 运算符非常耗时

将这个想法(仅包含具有某些条件的过滤器)应用于您的命令可能具有的所有过滤器。

关于c# - 为什么简单的select会超时,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18811894/

相关文章:

c# - 按位运算

SQl 输出到 CSV(不带单引号)

sql-server - 删除具有最小日期和多个键的重复 MS-SQL

c# - 数据库插入错误 : "string or binary data would be truncated"

c# - SQL Server 和 Entity Framework - 动态列

c# - 将未知数量的列映射到字典

javascript - 基于单击的按钮隐藏 Kendo 实用程序窗口中的元素

c# - 在 XElement 上选择具有命名空间别名而不是 URI 的命名空间 XML 节点属性

sql - 从字符串中删除空格并选择在 sql server 中使用该字符串

mysql - 为什么 MySQL 没有按预期 ORDER?