C# 为什么linq to entities中的.ToList()需要花费时间?
我们有一个网站正在使用linq to entities,我们发现它最近非常慢,在排除故障后,我发现每当我们使用linq to entities从数据库中搜索数据时,都会消耗大量CPU时间,如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()可能会加载所有对象的外部对象(外键),如何强制它只加载对象 我的连接池是否太小 如果还有其他可能的原因,请告诉我,并为我指出解决这个
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)
- 解释后的表单被传输到数据库,在那里它执行它所执行的操作并返回数据对象
- 必须生成某种方法将传入的数据对象转换为所需的查询输出
- 数据库连接将返回到池
- 所需的查询输出可能在返回到代码之前对其进行状态跟踪
- 接收查询文本并根据现有计划的查询计划缓存进行检查
- 如果不存在计划,查询优化器将创建一个新计划并将其卡在计划缓存中
- 执行查询计划-IO/锁/CPU/内存-其中任何一个都可能是瓶颈
- 返回查询结果-网络可能是一个瓶颈,特别是当结果集很大时
显示估计的执行计划
按钮)。查询是否使用您期望的索引?该计划是否看起来很奇怪(可能是缓存中的坏计划)?查询是否按照预期的顺序处理表,并按照预期的方式执行嵌套/合并/哈希联接?当查询不值得并行化时(这是坏索引/大量IO的迹象),是否有并行化开始我想这就够了。希望我没有忘记要检查的任何明显的东西。在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