English 中文(简体)
ORM性能成本
原标题:
  • 时间:2009-01-16 20:24:01
  •  标签:

有没有任何经验表明,选择使用ORM(在Django,RoR,SQLAlcehemy等中)而不是SQL和手动设计数据库会使开发者遭受何种性能损失?我想象有复杂的问题,包括在ORM约束内指定数据库是否增加或减少了创建高效数据库结构的机会(基于开发者的经验水平),以及开发者构建SQL或基于ORM查询的能力(同样基于他/她的经验水平)。任何有关这些或固有性能问题的信息对我来说都非常有趣。

最佳回答

我的建议是,在您需要之前不要担心这个问题-不要过早优化。ORM可以提供许多开发速度、代码可读性方面的好处,并且可以消除很多代码重复。如果使用ORM可以使您的应用程序更容易开发,我建议使用。

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

问题回答

在大多数DAL层的开发/架构中,性能一直是后来的想法。我认为现在是时候开始质疑这些ORM工具的性能了,因为它们所承诺的开发简易性。 (Translation provided by an AI language model)

ORM中最大的性能问题区域有两个:

  1. 无法编写最佳SQL。您必须使用一种对象查询语言,该语言由框架解释成SQL。大多数情况下,它是良好的SQL,但是通常它不是最有效的SQL。

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

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

这也取决于您使用的ORM。根据我的经验,Hibernate在速度、资源使用和启动时间方面都比较糟糕。另一方面,LINQ to SQL是一个非常轻量级的SQL包装器,您可能几乎甚至都不会注意到其影响。

表现-总有优点和缺点。如果您深入ORM架构(请参见我的文章:避免ORM坏习惯),那么您会直观地找到使其更快的方法。这是我另一篇关于如何使EF6x 5x更快(至少在读取情况下)的文章:EF6.x 5x更快

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





相关问题
热门标签