有没有任何经验表明,选择使用ORM(在Django,RoR,SQLAlcehemy等中)而不是SQL和手动设计数据库会使开发者遭受何种性能损失?我想象有复杂的问题,包括在ORM约束内指定数据库是否增加或减少了创建高效数据库结构的机会(基于开发者的经验水平),以及开发者构建SQL或基于ORM查询的能力(同样基于他/她的经验水平)。任何有关这些或固有性能问题的信息对我来说都非常有趣。
我的建议是,在您需要之前不要担心这个问题-不要过早优化。ORM可以提供许多开发速度、代码可读性方面的好处,并且可以消除很多代码重复。如果使用ORM可以使您的应用程序更容易开发,我建议使用。
在开发过程中,使用基准测试和分析来确定代码中的瓶颈,必要时可以绕过ORM并在需要时使用手动查询。通常情况下,您可以使用缓存和数据库索引(等等)来提高ORM的速度,然后可以决定何时需要手动查询。在大多数情况下,ORM的性能可能是可接受的,使用ORM的好处将远远超过性能成本。
在大多数DAL层的开发/架构中,性能一直是后来的想法。我认为现在是时候开始质疑这些ORM工具的性能了,因为它们所承诺的开发简易性。 (Translation provided by an AI language model)
ORM中最大的性能问题区域有两个:
无法编写最佳SQL。您必须使用一种对象查询语言,该语言由框架解释成SQL。大多数情况下,它是良好的SQL,但是通常它不是最有效的SQL。
反射。大多数ORM框架使用反射来从数据库中填充对象数据。反射操作是昂贵的,并且随着负载和数据量的增加,性能下降变得很明显。
其他出现的性能问题是由于数据库设计或实体模型设计效率低下,这是由实体对象与表的紧密耦合所致。
这也取决于您使用的ORM。根据我的经验,Hibernate在速度、资源使用和启动时间方面都比较糟糕。另一方面,LINQ to SQL是一个非常轻量级的SQL包装器,您可能几乎甚至都不会注意到其影响。
表现-总有优点和缺点。如果您深入ORM架构(请参见我的文章:避免ORM坏习惯),那么您会直观地找到使其更快的方法。这是我另一篇关于如何使EF6x 5x更快(至少在读取情况下)的文章:EF6.x 5x更快。
无论如何,为了获得良好的性能,即使使用 ORM,您也需要创建数据库视图和索引,以检查由 ORM 生成并执行的查询,并进行微调。使用 ORM 必须进行积极加载。
- winforms
- combobox
- fogbugz
- java
- date
- internationalization
- asp.net
- iis
- url-rewriting
- urlrewriter
- c#
- enums
- ocaml
- haxe
- algorithm
- string
- viewstate
- .net
- c++
- c
- symbol-table
- mysql
- database
- postgresql
- licensing
- migration
- vb.net
- vb6
- declaration
- vb6-migration
- python
- psycopg2
- backup
- vmware
- virtualization
- gnu-screen
- authentication
- desktop
- excel
- xll
- cultureinfo
- regioninfo
- oracle
- client
- session
- download
- html
- virtual
- constructor
- scenarios
- perl
- full-text-search
- javascript
- ajax
- testing
- oop
- inheritance
- vim
- encapsulation
- information-hiding