C# 一致慢速EF查询
我有以下查找:C# 一致慢速EF查询,c#,mysql,entity-framework,C#,Mysql,Entity Framework,我有以下查找: using (var ctx = new dbContext()) { if (page == 0) page = 1; //_query = "SELECT * FROM [Log] WHERE [ApplicationId] = {0} and [LogTime] >= '{1}' ORDER BY [LogTime] DESC OFFSET (({2} - 1) * {3}) ROWS FETCH NEXT {3} ROWS ONLY" var l
using (var ctx = new dbContext())
{
if (page == 0) page = 1;
//_query = "SELECT * FROM [Log] WHERE [ApplicationId] = {0} and [LogTime] >= '{1}' ORDER BY [LogTime] DESC OFFSET (({2} - 1) * {3}) ROWS FETCH NEXT {3} ROWS ONLY"
var logs = ctx.Logs.SqlQuery(string.Format(_query, id, time, 1, 20000)).ToList();
//var logs = ctx.Logs.Where(x => x.ApplicationId == id && x.LogTime >= time).ToList();
return logs;
}
给定正确的时间,此查询将返回大约20000个条目。执行查询需要13-18秒,但在SQLMS中,查询会立即完成
该表如下所示:
Log
LogId (PK,int, not null)
ApplicationId (FK,int,not null)
Type(nvarchar(50), not null)
Code(nvarchar(50), null)
Source(nvarchar(50), not null)
Message(ntext, null)
LogTime(datetime, not null)
我想这不会花那么长时间我是否遗漏了某些内容或应该进行更改以提高性能?20000条记录是一个查询中要返回的大量记录。当您在SQL Management Studio中运行它时,查询会立即返回。在SQLManagementStudio中运行它时没有额外的开销。它只是在屏幕上返回结果 当您将其作为EF查询运行时,获取结果会产生网络开销。它会变慢的一个关键原因是,它需要将获取的结果转换为Log类型的对象。这将占用您提到的大部分操作时间(13-18秒) 总之,EF查询由多个步骤组成。 1.对数据库的查询
2.将结果转换为对象(这将需要20000条记录)通过EF执行查询时,需要几个步骤:
它慢的原因可能在这些步骤中的任何一个。可以通过在调用
ToList()
之前插入AsNoTracking()
来禁用更改跟踪器。请重新格式化您的问题:查询在哪里?你的模式在哪里?您可以在表上运行show index来显示索引吗?