大型高流量的网站是否使用ORM?

11

我最终决定使用Entity Framework,因为它在所有ORM中具有最佳性能。但在开始阅读和编写代码之前,我想知道是否有任何高访问量的网站使用ORM。


10
我不认为那是真的,你看过LLBLGen吗?你是如何确定它有最佳性能的? - Noon Silk
1
这篇文章并没有回答哪种ORM性能最好,但是与这个问题相关的值得一读:https://dev59.com/ynRB5IYBdhLWcg3w9b59 - ddc0660
4
我举手并质疑任何声称“EF的表现优于任何其他ORM”的网站。 - mxmissile
2
不要追求“最快的ORM”,只需选择一个看起来相当受推崇并与您的需求相符的ORM,然后开始编写。我认为ORM选择成为您未来瓶颈的说法是胡扯。 - Rex M
1
性能是相对的,不同的ORM根据使用特征表现不同。数据库是大还是小?有多少个连接/表/关系?你几乎只有SELECT还是也有大量的INSERT或UPDATE?高流量新闻网站与高流量论坛/协作网站具有不同的特点(BBC.co.uk != en.wikipedia.org),因此我对任何没有经过全面基准测试的扁平“ORM X是最快的”声明提出质疑。 - Michael Stum
显示剩余4条评论
6个回答

13

目前,EF的发布版本,即.NET 3.5中的v1.0性能十分糟糕。一年前它首次发布时,我进行了广泛的测试,并与微软进行了多次长时间的邮件讨论。EF当前的效率有很大的提升空间,在许多情况下,它生成的SQL查询语句非常糟糕,会严重影响性能。

在.NET 4.0中的Entity Framework v4.0要好得多。它们解决了EF v1.0所困扰的大部分甚至全部的不良SQL生成问题(包括我在一年前提出的问题)。EF v4.0是否具有最佳性能还有待观察。它比LINQ to SQL更复杂,因为它提供了更大的灵活性。由于发行版本尚未推出,因此无法确定EF v4.0是否是最快的。

对于这个问题的客观答案需要对主要的ORM供应商进行客观、公正的比较,如EF、LINQ to SQL、nHibernate(最好带有LINQ提供程序)、LLBLGen,以及一些新近加入的ORM供应商,如Telerik的ORM、Subsonic等。

至于使用ORM的大规模高容量生产系统,我建议看看StackOverflow.com本身,它使用的是LINQ to SQL。SO已成为互联网上最顶尖的程序员社区之一,绝对具有高容量性能。至于其他网站,我不能确定。大多数主要Web应用程序的内部实现细节通常是一个谜。我所知道的大多数ORM使用都是用于内部企业系统,如金融系统、医疗保健等。对象数据库也用于同类型的系统,但使用较少。我建议搜索ORM的使用和高容量Web站点。

需要注意的一点是,确保您找到的评测是最新的。在过去的两年里,ORM领域发生了很多变化。性能、效率、功能、动态SQL的RDBMS调整能力等方面都有了显著改善,自ORM十年前首次创建以来。


很奇怪,我的EF使用经验是它生成的查询非常优化,特别是在连接方面,至少比NHibernate要好。 - Chris S
1
如果我能找到它们,我在旧的 MSDN EF 论坛上有几个线程,展示了 EF v1.0 生成的一些真正可怕的 SQL。我将 L2S 生成的 SQL 与 EF 的进行了比较,不仅 SQL 是多层嵌套选择、空连接和其他奇怪的 crud 的怪物......而且性能比 L2S 查询差了 10 个数量级。在一个案例中,我试图从几百个记录的联接中选择 90 条记录。EF 查询的联接方式导致 SQL Server 必须在内部过滤 500 亿个虚拟行。 - jrista

6

我知道在某个播客中,Jeff提到stackoverflow使用Linq-to-SQL。


6
“真正”高流量的网站事实上正在完全放弃SQL数据库,因为在当今应用程序中普遍存在写入密集型工作负载,几乎不可能使它们扩展到超过一台计算机,无论有没有ORM。这被称为“ NoSQL运动
然而,虽然这是一个非常时尚的话题,但对于没有数千个活跃并发用户的网站来说,这是完全无关紧要的。同时担心ORM性能也是一个类似的问题:除非ORM被严重错误地实现或应用(否则大多数网站实际上都不足以成为“高流量”问题)。

4

虽然没有直接回答哪个ORM更快,正如Ayende(NHibernate作者)所指出的那样,很容易做错或者至少会使你想要的方向倾斜,但是有一些应用程序正在使用ORM作为它们的一部分。

Twitter(曾经?)使用Ruby on Rails(RoR),RoR使用ORM。37 signal的人们在他们的应用程序中也使用了RoR……我知道这些不是.Net,但正如kuoson所提到的,L2S被SO采用,还有很多人像Jeffrey Palermo和Headspring一样使用NHibernate。我不会惊讶地发现许多最近开发的Web应用程序正在使用ORM。

即使ORM会影响性能,但大多数ORM允许在必要时自定义使用的SQL。大多数建议使用ORM,然后在出现瓶颈时进行修复。此外,一个好的ORM为您解决了很多问题,因此编写自己的数据访问层(DAL)变得更加困难。

Twitter因性能原因已经放弃了RoR作为其后端处理语言。 - Michael Borgwardt
没错,但这并不意味着ORM不能发挥作用。 :) - Kevin LaBranche

4
jrista是正确的。我只想补充一点,您应该认真考虑LINQ to SQL。从简单性和性能方面来看,它是更好的技术(目前)。它非常快速并且在开箱即用时相当有能力。如果您想进一步改善LINQ to SQL,请查看PLINQO框架。
PLINQO是一个围绕标准LINQ to SQL的框架,添加了大量功能,包括一些非常优雅的批量操作和缓存功能。最重要的是,PLINQO适应数据库模式的变化,但保留您的自定义代码。这非常流畅,并且在我看来是最有价值的方面。

PLINQO不是免费的,而LinqToSql存在许多问题。Subsonic提供了免费的极简主义。NHibernate可以免费扩展。 - Michael Maddox
1
是的,PLINQO是免费的。如果你是指Codesmith,那就不是免费的。 - Ralph Lavelle

2
当然,Reddit使用了SQLAlchemy的部分功能(我认为他们重写了大部分功能,原因不明)。大多数,如果不是所有的大型Django网站都使用ORM(包括以前的Pownce和Curse)。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接