San*_*ker 5 c# linq sql-server performance entity-framework
我们有 18 个表连接,这是 ERP 系统的典型特征。联接是通过实体框架上的 LINQ 完成的。
随着添加更多连接,连接逐渐变慢。返回结果集很小(15 条记录)。LINQ 生成的查询是通过 SQL Profiler 捕获的,当我们通过 Microsoft 管理控制台运行它时,速度非常快:10 毫秒。当我们通过我们的 C# LINQ-over-EntityFramework 运行它时,它需要 4 秒。
我猜正在发生的事情:将表达式树编译成 SQL 所需的时间是总共 4 秒中的 2 秒,另外 2 秒我猜是在内部将 SQL 结果集转换为实际的 C# 类。它也没有连接到实体框架的初始化,因为我们之前运行了一些查询,并且对这个连接的重复调用产生了相同的 4 秒。
有没有办法加快这个速度。否则我们正在考虑放弃实体框架,因为它绝对是低效的......
如果它有帮助的话,我遇到了一个严重的性能问题,在原始 SQL 中花费 1-2 秒的简单查询通过 EF 花费了大约 11 秒。
我从使用...
List<GeographicalLocation> geographicalLocations = new SalesTrackerCRMEntities()
.CreateObjectSet<GeographicalLocation>()
.Where(g => g.Active)
.ToList();
Run Code Online (Sandbox Code Playgroud)
通过 EF 大约花费了 11 秒,然后使用...
var geographicalLocations = getContext().CreateObjectSet<GeographicalLocation>()
.AsNoTracking()
.Where(g => g.Active).ToList();
Run Code Online (Sandbox Code Playgroud)
整个过程花费了不到 200毫秒。
这样做的缺点是它不会加载相关实体,因此您必须随后手动加载它们,但它提供了如此巨大的性能提升,以至于非常值得(至少在这种情况下)。
您必须单独评估每种情况,看看额外的速度是否值得额外的代码。
| 归档时间: |
|
| 查看次数: |
8806 次 |
| 最近记录: |