Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/338.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/mysql/71.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/ant/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 一致慢速EF查询_C#_Mysql_Entity Framework - Fatal编程技术网

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执行查询时,需要几个步骤:

  • 查询数据库
  • 将响应传输到查询进程
  • 将返回的数据具体化为.NET对象
  • 将对象添加到更改跟踪器

  • 它慢的原因可能在这些步骤中的任何一个。可以通过在调用
    ToList()
    之前插入
    AsNoTracking()
    来禁用更改跟踪器。

    请重新格式化您的问题:查询在哪里?你的模式在哪里?您可以在表上运行show index来显示索引吗?