ORM性能成本

23

有没有人有使用ORM(在Django、RoR、SQLAlchemy等中)而不是使用SQL和手动设计数据库的经验,可以说明开发人员可能会遇到哪种性能问题?我想象中存在复杂的问题,包括ORM约束下指定数据库是否增加或减少了创建有效数据库结构的机会(根据开发人员的经验水平),以及开发人员如何构建SQL或基于ORM的查询语句(同样取决于其经验)。任何关于这些或固有性能问题的信息对我来说都很有趣。


4个回答

33

我的建议是,在不必要的情况下不要担心这个-不要过度优化。ORM可以提供许多开发速度、代码可读性和减少很多重复代码的好处。如果使用ORM会使您的应用程序更容易开发,我建议您使用它。

在开发过程中,使用基准测试和分析来确定代码中的瓶颈,如果需要,您可以绕过ORM并在必要时使用手动查询。通常情况下,您可以使用缓存和数据库索引(等等)来提高ORM的速度,然后再决定何时需要手动查询。在大部分情况下,ORM性能可能是可接受的,并且使用它的好处将远远超过性能成本。


是的,我同意这个观点。ORM可能会做一些很好的事情,而你可能无法通过手动SQL进行优化,除非进行调整。 - Arthur Thomas
使用IQueryables、Includes(贪婪加载)和投影将使您的ORM(项目)更快...此外,我在我的直接回答中还包含了2个链接。 - baHI

17

在大多数数据访问层(DAL)的开发/架构过程中,性能一直是事后考虑的。我认为到了我们开始质疑这些ORM工具的性能是否达标的时候了,尽管它们承诺了所谓的易开发性:

ORM存在的两个最大的性能问题是:

  1. 无法编写最佳SQL语句。你必须使用一个对象查询语言,然后由框架将其解释成SQL语句。大多数情况下,这是好的SQL语句,但往往不是最有效的SQL语句。

  2. 反射。大多数ORM框架使用反射从数据库填充对象数据。反射操作是昂贵的,随着负载和数据量的增加,性能下降变得明显。

由于实体对象与表之间的紧密耦合,其他性能问题也会出现,这导致了数据库设计或实体模型设计的低效率。


3

这也取决于您使用的ORM是什么。根据我的经验,Hibernate在速度、资源使用和启动时间方面都很慢。另一方面,LINQ to SQL是一个极轻量级的SQL包装器,你可能几乎不会注意到它的影响。


NHibernate使用标识列比EF6.x更快。而且在速度上甚至可与EF7相媲美。但是对于读操作,EF6.x可以被优化到非常快。请在该论坛中查看我的直接答案。 - baHI

-1

性能 - 总是有利有弊。如果你深入研究ORM架构(请参阅我的文章:避免ORM的坏习惯),那么你会直观地找到使其更快的方法。这是我另一篇关于如何使EF6x 5x 更快(至少对于读取情况)的文章:EF6.x 5x faster

无论如何,为了获得良好的性能,即使使用ORM,您也需要创建数据库视图和索引,以检查ORM生成和执行的查询,并对其进行微调。使用ORM时,急切加载是必须的。


这些文章过于.NET特定,不太适合在这里进行适当的讨论。 - Michael

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