有没有人有使用ORM(在Django、RoR、SQLAlchemy等中)而不是使用SQL和手动设计数据库的经验,可以说明开发人员可能会遇到哪种性能问题?我想象中存在复杂的问题,包括ORM约束下指定数据库是否增加或减少了创建有效数据库结构的机会(根据开发人员的经验水平),以及开发人员如何构建SQL或基于ORM的查询语句(同样取决于其经验)。任何关于这些或固有性能问题的信息对我来说都很有趣。
有没有人有使用ORM(在Django、RoR、SQLAlchemy等中)而不是使用SQL和手动设计数据库的经验,可以说明开发人员可能会遇到哪种性能问题?我想象中存在复杂的问题,包括ORM约束下指定数据库是否增加或减少了创建有效数据库结构的机会(根据开发人员的经验水平),以及开发人员如何构建SQL或基于ORM的查询语句(同样取决于其经验)。任何关于这些或固有性能问题的信息对我来说都很有趣。
我的建议是,在不必要的情况下不要担心这个-不要过度优化。ORM可以提供许多开发速度、代码可读性和减少很多重复代码的好处。如果使用ORM会使您的应用程序更容易开发,我建议您使用它。
在开发过程中,使用基准测试和分析来确定代码中的瓶颈,如果需要,您可以绕过ORM并在必要时使用手动查询。通常情况下,您可以使用缓存和数据库索引(等等)来提高ORM的速度,然后再决定何时需要手动查询。在大部分情况下,ORM性能可能是可接受的,并且使用它的好处将远远超过性能成本。
在大多数数据访问层(DAL)的开发/架构过程中,性能一直是事后考虑的。我认为到了我们开始质疑这些ORM工具的性能是否达标的时候了,尽管它们承诺了所谓的易开发性:
ORM存在的两个最大的性能问题是:
无法编写最佳SQL语句。你必须使用一个对象查询语言,然后由框架将其解释成SQL语句。大多数情况下,这是好的SQL语句,但往往不是最有效的SQL语句。
反射。大多数ORM框架使用反射从数据库填充对象数据。反射操作是昂贵的,随着负载和数据量的增加,性能下降变得明显。
由于实体对象与表之间的紧密耦合,其他性能问题也会出现,这导致了数据库设计或实体模型设计的低效率。
这也取决于您使用的ORM是什么。根据我的经验,Hibernate在速度、资源使用和启动时间方面都很慢。另一方面,LINQ to SQL是一个极轻量级的SQL包装器,你可能几乎不会注意到它的影响。
性能 - 总是有利有弊。如果你深入研究ORM架构(请参阅我的文章:避免ORM的坏习惯),那么你会直观地找到使其更快的方法。这是我另一篇关于如何使EF6x 5x 更快(至少对于读取情况)的文章:EF6.x 5x faster
无论如何,为了获得良好的性能,即使使用ORM,您也需要创建数据库视图和索引,以检查ORM生成和执行的查询,并对其进行微调。使用ORM时,急切加载是必须的。