Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/298.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# 为什么linq to entities中的.ToList()需要花费时间?_C#_Asp.net Mvc_Linq_Linq To Entities - Fatal编程技术网

C# 为什么linq to entities中的.ToList()需要花费时间?

C# 为什么linq to entities中的.ToList()需要花费时间?,c#,asp.net-mvc,linq,linq-to-entities,C#,Asp.net Mvc,Linq,Linq To Entities,我们有一个网站正在使用linq to entities,我们发现它最近非常慢,在排除故障后,我发现每当我们使用linq to entities从数据库中搜索数据时,都会消耗大量CPU时间,如toList()函数。我知道这可能是因为数据库中有大量数据导致响应缓慢,但我只是想知道是否还有其他原因可能导致此问题 我应该如何优化这类问题?以下是可能的原因: ToList()可能会加载所有对象的外部对象(外键),如何强制它只加载对象 我的连接池是否太小 如果还有其他可能的原因,请告诉我,并为我指出解决这个

我们有一个网站正在使用linq to entities,我们发现它最近非常慢,在排除故障后,我发现每当我们使用linq to entities从数据库中搜索数据时,都会消耗大量CPU时间,如
toList()
函数。我知道这可能是因为数据库中有大量数据导致响应缓慢,但我只是想知道是否还有其他原因可能导致此问题

我应该如何优化这类问题?以下是可能的原因:

  • ToList()
    可能会加载所有对象的外部对象(外键),如何强制它只加载对象

  • 我的连接池是否太小


  • 如果还有其他可能的原因,请告诉我,并为我指出解决这个问题的正确方向

    在Linq中-当查询被枚举时,查询将一系列操作的结果返回给源

    IQueryable<Customer> myQuery = ...
    
    foreach(Customer c in myQuery)  //enumerating the query causes it to be executed
    {
    
    }
    
    List<Customer> customers = myQuery.ToList();
      // ToList will enumerate the query, and put the results in a list.
      // enumerating the query causes it to be executed.
    
    IQueryable myQuery=。。。
    foreach(myQuery中的客户c)//枚举查询会导致执行查询
    {
    }
    List customers=myQuery.ToList();
    //ToList将枚举查询,并将结果放入列表中。
    //枚举查询会导致执行查询。
    
    执行查询需要一些东西(没有特定的顺序)

    • 从池中提取数据库连接
    • 查询由查询提供程序解释(在本例中,提供程序是linq to实体,解释是某种形式的sql)
    • 解释后的表单被传输到数据库,在那里它执行它所执行的操作并返回数据对象
    • 必须生成某种方法将传入的数据对象转换为所需的查询输出
    • 数据库连接将返回到池
    • 所需的查询输出可能在返回到代码之前对其进行状态跟踪
    此外,数据库还有几个步骤,这里从查询sql server的角度列出:

    • 接收查询文本并根据现有计划的查询计划缓存进行检查
    • 如果不存在计划,查询优化器将创建一个新计划并将其卡在计划缓存中
    • 执行查询计划-IO/锁/CPU/内存-其中任何一个都可能是瓶颈
    • 返回查询结果-网络可能是一个瓶颈,特别是当结果集很大时
    因此,为了找出查询的问题所在,您需要开始测量。我会按照检查的顺序来排列这些目标。这不是一个完整的列表

  • 获取查询的已翻译sql文本。您可以为此使用sql server探查器。您可以使用调试器。有很多方法可以做到这一点。确保查询文本返回对象所需的内容,不多不少。确保查询的表符合您的期望。运行查询几次

  • 看看结果集。这是合理的,还是我们期待着500亿美元的结果?当不需要整张表时,是否查询了整张表?是否意外生成笛卡尔结果

  • 获取查询的执行计划(在sqlstudio中,单击
    显示估计的执行计划
    按钮)。查询是否使用您期望的索引?该计划是否看起来很奇怪(可能是缓存中的坏计划)?查询是否按照预期的顺序处理表,并按照预期的方式执行嵌套/合并/哈希联接?当查询不值得并行化时(这是坏索引/大量IO的迹象),是否有并行化开始

  • 测量查询的IO。(在sql server中,发出SET STATISTICS IO ON)。检查每个表的逻辑IO。哪张桌子最显眼?同样,查找表访问的错误顺序或支持查询的索引

    如果您已经做到了这一点,您很可能已经发现并解决了问题。不过我会继续走,以防你没有

  • 比较查询的执行时间与枚举的执行时间。如果差异很大,可能是解释数据对象的代码速度慢,或者生成的代码速度慢。也可能是查询的翻译花了一段时间。这些都是需要解决的棘手问题(在LinqToSql中,我们使用编译后的查询对它们进行排序)

  • 测量运行代码的机器的内存和CPU。如果您被限制在那里,请使用代码探查器或内存探查器来识别和解决问题

  • 查看计算机上的网络统计信息,尤其是您可能希望使用TCPView查看计算机上的TCP套接字连接。套接字资源可能被误用(例如一分钟内打开和关闭数千个)

  • 检查数据库中是否有其他连接持有的锁


  • 我想这就够了。希望我没有忘记要检查的任何明显的东西。

    在Linq中-当查询被枚举时,查询会将一系列操作的结果返回给源

    IQueryable<Customer> myQuery = ...
    
    foreach(Customer c in myQuery)  //enumerating the query causes it to be executed
    {
    
    }
    
    List<Customer> customers = myQuery.ToList();
      // ToList will enumerate the query, and put the results in a list.
      // enumerating the query causes it to be executed.
    
    IQueryable myQuery=。。。
    foreach(myQuery中的客户c)//枚举查询会导致执行查询
    {
    }
    List customers=myQuery.ToList();
    //ToList将枚举查询,并将结果放入列表中。
    //枚举查询会导致执行查询。
    
    执行查询需要一些东西(没有特定的顺序)

    • 从池中提取数据库连接
    • 查询由查询提供程序解释(在本例中,提供程序是linq to实体,解释是某种形式的sql)
    • 解释后的表单被传输到数据库,在那里它执行它所执行的操作并返回数据对象
    • 必须生成某种方法将传入的数据对象转换为所需的查询输出
    • 数据库连接返回到t