回答

收藏

ORM选择n 1性能;添加或不添加;

技术问答 技术问答 393 人阅读 | 0 人回复 | 2023-09-14

也有类似的问题,但我认为没有人问过这个特定的问题。
: |, M6 ^" l0 G0 S: N3 L设想:3 @: L$ N: |) r$ ^6 F* y
客户-订单(包括客户ID)-OrderPart-部件. H7 l8 n9 `4 ?- J0 {- n4 T  I
我想要一个有所有订单和每个订单及其零件的客户。4 H" p6 N3 _" C7 R9 X% c
现在,我有两个主要选择:9 H! S- ?7 |- {! [7 C
[ol]使用嵌套循环(产生单独查询)! H; u/ c( p$ B. j/ U0 t- n( W
使用数据加载选项(产生单个查询连接)[/ol]问题:" l, D) l: b% D0 l; p
关于ORM大多数建议和示例都建议使用选项2,我能理解为什么。然而,选项2可能会发送大量重复的数据,例如:/ _, }0 O" [" o3 b" _' P& r
Option 1 results (3 queries):
4 D0 J7 {9 v6 yID  Name       Country1   Customer1  UKID  Name1   Order12   Order2ID  Name1   Part12   Part23   Part3Option 2 results (1 query):
2 U; m& s0 O* }4 o/ p8 pID  Name       Country  ID  Name    ID Name1   Customer1  UK        1      Order1  1  Part11   Customer1  UK        1      Order1  2  Part21   Customer1  UK        1      Order1  3  Part31   Customer1  UK         2                                 2         Order2  1  Part11   Customer1  UK         2                                 2         Order2  2  Part2选项1发送带有3个查询的13个字段。选项2在1个查询中发回42个字段。现在,假设客户表有30个字段,订单有更复杂的子连接,数据重复将很快变得巨大。1 R6 R* R+ W/ B" @
对整体性能的影响如下:
- F7 u2 ]0 A/ @0 F, q7 h建立数据库连接的费用
% D( ^$ Q3 p$ |, _6 P发送数据的时间(如果是在其他服务器上,则可能是跨网络)
  G! [. Z2 i( z5 k; j带宽
选项2始终是最佳选择,选项1是最佳选择还是取决于情况?如有必要,应该用什么标准来确定?有足够的吗?ORM聪明地自己解决?0 \9 Y) j# m6 f) g$ j$ H3 q* @- S
                                                               
5 I! m! ?( B. V1 c5 `# Z7 g( R    解决方案:                                                                3 E  W# `* W1 f$ }' _! \
                                                                建立数据库连接的费用如果它们位于通常的同一子网中,则很少。如果不是,那么这仍然不是很大的开销,可以通过大多数ORM克服缓存(NHibernate一级和二级缓存)。) A5 s% r/ K( \
发送数据的时间(如果是在其他服务器上,则可能是跨网络)因为SELECTN 1显然会更长,因为它必须每次发送select句子最长可能长达1k。它还必须从池中获得新的连接。2002年至2003年使用Chatty与矮胖的声明一直是争论的焦点,但除非这是一个非常大的应用程序,否则现在就没有太大的不同了。在这种情况下,你可能希望有经验的(或更高的薪水)专家来表达他的观点。
: b8 ]: |6 p: _0 b& `-即顾问。+ S, ~8 F% M2 I0 ~) l4 I
然而,我希望加入连接,因为数据库将在10年或10年的开发过程中优化这种用法。如果性能真的很慢,View可以解决这个问题或存储过程。
1 N, R2 o8 y6 V( s; f4 }0 O: R顺便说一句,SELECTN 1这可能是人们第一次使用它NHibernate最常见的性能问题(包括我自己),其实需要调整才能解决。这是因为NHibernate对ORM而言就像C& K  x  h9 j  q4 p
        和语言一样。
3 ^3 A) y, D% E3 ]+ f带宽SELECT每个对象的额外语句Customer最终会建立很多Customer对象* Orders。因此,对于大型系统来说,这可能很明显-
9 ?- x9 j( A0 g但就像我提到的,ORM通常有适当的缓存机制来消除这个问题。SELECT考虑到以下事实,句子的数量不会那么大:
4 U4 A0 w* ]# w( J- x8 i) J% W大多数情况下,你和SQL Server在同一网络上
7 J3 T4 B3 j0 P4 N字节数的增加会带来额外的0.5-50k额外带宽?想想大多数服务器有多快。
分享到:
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则