首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >实体框架太慢。我有什么选择?

实体框架太慢。我有什么选择?
EN

Stack Overflow用户
提问于 2011-12-02 04:15:09
回答 13查看 127.6K关注 0票数 94

我遵循了“不要过早优化”的原则,并使用实体框架编写了我的WCF服务。

然而,我分析了性能和实体框架太慢了。(我的应用程序在大约1.2秒内处理2条消息,而我正在重写的(遗留)应用程序在同一时间内处理5-6条消息。(旧式应用程序调用sprocs以访问其数据库。)

我的分析指出实体框架占用了每条消息的大部分时间。

那么,我有什么选择呢?

  • 还有更好的ORM吗?

(只支持对象的正常读写,而且速度快的东西。)

  • 有没有办法让实体框架更快?

(:当我说更快的时候,我是指从长远来看,而不是第一次调用。(第一次调用很慢(一条消息需要15秒),但这不是问题。我只需要它在剩下的messages.)

  • Some神秘的第三个选项中更快,这将帮助我从我的服务中获得更快的速度。

注意:我的大多数数据库交互都是创建和更新。我很少进行选择和删除。

EN

回答 13

Stack Overflow用户

回答已采纳

发布于 2011-12-02 04:34:18

您应该从分析实体框架实际发出的SQL命令开始。根据您的配置(POCO,自跟踪实体),有很大的优化空间。您可以使用ObjectSet<T>.ToTraceString()方法调试SQL命令(在调试模式和发布模式之间应该没有区别)。如果您遇到需要进一步优化的查询,您可以使用一些投影来为EF提供有关您试图完成的内容的更多信息。

示例:

代码语言:javascript
复制
Product product = db.Products.SingleOrDefault(p => p.Id == 10);
// executes SELECT * FROM Products WHERE Id = 10

ProductDto dto = new ProductDto();
foreach (Category category in product.Categories)
// executes SELECT * FROM Categories WHERE ProductId = 10
{
    dto.Categories.Add(new CategoryDto { Name = category.Name });
}

可以替换为:

代码语言:javascript
复制
var query = from p in db.Products
            where p.Id == 10
            select new
            {
                p.Name,
                Categories = from c in p.Categories select c.Name
            };
ProductDto dto = new ProductDto();
foreach (var categoryName in query.Single().Categories)
// Executes SELECT p.Id, c.Name FROM Products as p, Categories as c WHERE p.Id = 10 AND p.Id = c.ProductId
{
    dto.Categories.Add(new CategoryDto { Name = categoryName });
}

我只是凭空输入的,所以这并不是它的执行方式,但是如果你告诉EF你所知道的关于查询的一切(在本例中,我们需要类别名),EF实际上做了一些很好的优化。但这不同于急切加载(db.Products.Include(“类别”)),因为投影可以进一步减少要加载的数据量。

票数 48
EN

Stack Overflow用户

发布于 2011-12-29 19:42:43

事实是,像Entity Framework这样的产品总是缓慢和低效的,因为它们执行的代码要多得多。

我还发现人们建议优化LINQ查询,查看生成的SQL,使用调试器,预编译,采取许多额外的步骤,等等,也就是浪费很多时间,这也是很愚蠢的。没有人说--简化!每个人都想通过采取更多的步骤(浪费时间)来使事情变得更加复杂。

一种常识方法是根本不使用EF或LINQ。使用纯SQL。这并没有什么问题。仅仅因为程序员中有从众心理,他们感觉到使用每一个新产品的冲动,并不意味着它是好的或它会工作。大多数程序员认为,如果他们合并了大公司发布的每一段新代码,就会使他们成为更聪明的程序员;根本不是这样的。智能编程主要是关于如何在最少的时间内做更多的事情,减少令人头疼的事情,减少不确定性。记住-时间到了!这是最重要的元素,所以尽量不要浪费在解决糟糕/臃肿的代码中的问题上,仅仅是为了符合一些奇怪的所谓“模式”。

放松,享受生活,从编码中休息一下,停止使用额外的功能,代码,产品,“模式”。生命是短暂的,你的代码的生命周期更短,这当然不是火箭科学。去掉LINQ、EF等层,你的代码就能高效运行、可伸缩,是的,它仍然很容易维护。太多的抽象是一个糟糕的“模式”。

这就是你的问题的解决方案。

票数 82
EN

Stack Overflow用户

发布于 2011-12-02 04:38:40

一种建议是仅对单记录CRUD语句使用LINQ to Entity Framework。

对于更复杂的查询、搜索、报告等,请编写一个存储过程并将其添加到实体框架模型中,如on MSDN所述。

这是我在我的几个网站上采取的方法,它似乎是效率和性能之间的一个很好的折衷。实体框架并不总是为手头的任务生成最有效的SQL。为更复杂的查询编写存储过程实际上为我节省了时间,而不是花费时间来找出原因。一旦你熟悉了这个过程,将存储的proc添加到EF模型中并不是一件太麻烦的事情。当然,将它添加到模型中的好处是,您可以从使用ORM中获得所有强类型的好处。

票数 38
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/8347670

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档