我们最近从out数据库中删除了大量记录。删除之后,从生成的语句将超时。我们也设置SET事务隔离级别,为这些语句读取未提交的数据。
实体框架代码
_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] 有什么想法会导致超时吗?
发布于 2014-02-21 16:06:41
它可能对你没有直接的帮助,但请结帐:
Which method performs better: .Any() vs .Count() > 0?
还没有像您所描述的那样出现任何性能问题,我将对表中记录是否存在的检查从.Count()更改为.Any()。但这可能只会对你有帮助,当你真的不需要精确的计数时。此外,我需要指出的是,我目前不删除大型表中的任何记录,通常在检查.where()之前,我将执行.count()子句。
当您将查询更改为.Where()时,可以尝试在收集.Count()的详细信息之前检查.Count()。
var queryList = _emailSendResultsRepository.GetTable()
.Where(e => e.EmailId == email.Id)
.Where(e.SendDate >= startDate)
.ToList();
if (queryList.Any())
{
....
queryList.Count()....
....
}在msdn论坛的一篇文章中提到:
“但是,即使从表中选择COUNT(*),在大型表上也会效率很低,就像Server进行全表扫描一样。”
发布于 2015-09-08 07:54:50
实际上,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以获得所需的结果。
https://stackoverflow.com/questions/21915324
复制相似问题