C# 当直接sql立即返回时,为什么实体框架会计算语句超时?
我们最近从数据库中删除了大量记录。删除后,从实体框架生成的此语句将超时。我们还将为这些语句设置事务隔离级别READ UNCOMMIT 实体框架代码C# 当直接sql立即返回时,为什么实体框架会计算语句超时?,c#,sql,sql-server,entity-framework,C#,Sql,Sql Server,Entity Framework,我们最近从数据库中删除了大量记录。删除后,从实体框架生成的此语句将超时。我们还将为这些语句设置事务隔离级别READ UNCOMMIT 实体框架代码 _emailSendResultsRepository.GetTable().Count(e => e.EmailId == email.Id && e.SendDate >= startDate); 生成此sql SELECT [GroupBy1].[A1] AS [C1] FROM ( SELECT
_emailSendResultsRepository.GetTable().Count(e => e.EmailId == email.Id && e.SendDate >= startDate);
生成此sql
SELECT
[GroupBy1].[A1] AS [C1]
FROM ( SELECT
COUNT(1) AS [A1]
FROM [dbo].[EmailSendResults] AS [Extent1]
WHERE ([Extent1].[EmailId] = @p__linq__0) AND ( CAST( [Extent1].[SendDate] AS datetime2) >= @p__linq__1)
) AS [GroupBy1]
如果我通过Sql management studio运行相同的语句,它将返回 马上。 在不快速返回日期的情况下计数到同一个表 所有其他数据调用似乎都工作正常。
有什么想法会导致超时吗?它可能不会直接帮助您,但请结帐: 由于还没有像您描述的那个样出现任何性能问题,我将表中记录的存在性检查从.Count更改为.any。但这只会在你真的不需要精确计数时对你有所帮助。此外,我需要指出的是,我目前没有删除大表中的任何记录,通常我会在检查.count之前执行.where子句 当您将查询更改为时,您可以在收集.Count的详细信息之前尝试检查.Any
var queryList = _emailSendResultsRepository.GetTable()
.Where(e => e.EmailId == email.Id)
.Where(e.SendDate >= startDate)
.ToList();
if (queryList.Any())
{
....
queryList.Count()....
....
}
在美国的一个职位上
其中提到:
但在大型表上,即使是SELECT COUNT*FROM Table也会非常低效,因为SQL Server会执行完整表扫描。
实际上,MarkusEgle,您提供的声明:
var queryList = messages
.Where(t => t.LogTimeStamp >= fromDate)
.Where(t => t.LogTimeStamp <= toDate)
.Where(t => t.LogType != stateInfoNoAuditFile)
.OrderBy(m => m.LogID)
.ToList();
执行查询并获取结果,因此,如果随后调用queryList.Count,它根本不涉及数据库,只计算列表内存中的对象。您应该删除ToList以获得所需的结果。为什么要调用。GetTable?另外,您可以对同一数据库进行其他调用吗?您是否收到任何错误?是否尝试分析发送到服务器的代码?这应该给你一个很好的线索。我有点惊讶EF没有为你生成参数化SQL。它应该使用Sql Server Profiler。如果我通过Sql management studio运行相同的语句,它会立即返回。-正如您的编辑所显示的,您没有从ManagementStudio运行相同的语句。如果从ManagementStudio运行相同的语句,会发生什么情况?从探查器复制精确的文本。这应该涉及sp_executesql系统存储过程。