这个问题的灵感来自于发布到最新 ServerFault 博客文章的评论:
你们还在使用 LINQ to SQL 吗?
我知道我可以使用 SQL Server Profiler 和/或方法来查看生成的ToTraceString
查询并自己分析它们。但是,我正在寻找具有管理使用 Entity Framework 的应用程序访问的数据库的实践经验的人的意见。
实体框架查询是性能问题的常见原因吗?
在这种情况下可以优化 LINQ 查询还是原始 Transact-SQL 是唯一的解决方案?
这个问题的灵感来自于发布到最新 ServerFault 博客文章的评论:
你们还在使用 LINQ to SQL 吗?
我知道我可以使用 SQL Server Profiler 和/或方法来查看生成的ToTraceString
查询并自己分析它们。但是,我正在寻找具有管理使用 Entity Framework 的应用程序访问的数据库的实践经验的人的意见。
实体框架查询是性能问题的常见原因吗?
在这种情况下可以优化 LINQ 查询还是原始 Transact-SQL 是唯一的解决方案?
这取决于查询是什么。ORM 通常非常擅长 CRUD,因为它们通常很简单。查询越复杂,错误查询的可能性就越大。您可以通过调整 LINQ 语句来调整生成的查询。不过,您迟早会厌倦打架,并为任何复杂的事情使用 SQL 查询或存储过程。
个别查询没问题
ORM 工具(Entity Framework、Linq、 LLBLGen、NHibernate等)的最大性能“问题”之一并不是执行的单个查询的性能(大多数只是检索单个查询的 CRUD 调用)根据主键记录回)。
不正确使用延迟加载 = 性能不佳
这是延迟加载的不正确使用,如果您没有正确设置预取属性,您最终可能会对数据库执行大量执行(可以在一次调用数据库中检索到的东西,变成 200 个人执行,所有网络和 IO 开销都与它们相关联)
从LINQ 到 SQL,延迟加载和预取
关键是知道你正在访问什么
使用 ORM 和自己动手操作之间 的真正区别在于,当您自己编写代码时,您不得不考虑 SQL 应该如何构建,并且您可以轻松地进入并针对您要解决的特定场景进行调整。
而在使用 ORM 时,您会受到 ORM 工具提供的选项和自定义的限制,并且许多开发人员只是将其留给 ORM 工具本身(假设/希望它会提出最佳计划),这就是 ORM 的原因工具被广泛认为有利于 CRUD,但不适用于更复杂的操作......
注意:延迟加载可能是一件非常好的事情,当它被不当使用时,这就是问题......
Linq to SQL 和 Linq to Entities(实体框架)是一些不同的实现。第一个比第二个更老、更轻量级的 ORM。由于性能,有人喜欢使用第一个。这里有一些链接可以找出这些技术之间的差异:
实体框架与 LINQ to SQL LINQ to SQL 与 ADO.NET 实体框架
这篇文章解释了为什么 EF 这么慢以及如何提高性能(如果可能的话:)):
EF 查询调优
主要问题:第一次调用数据库(实体创建,映射......)太慢了。因此,对于关键查询(应用程序),我仍然更喜欢旧的良好存储过程。作为一种变体,可以将 EF(我认为)与预加载的应用程序缓存一起使用。