回答

收藏

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

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

也有类似的问题,但我认为没有人问过这个特定的问题。
4 b* C0 g. m1 P4 L设想:& @6 L. H5 T8 b0 s. H4 P$ Z4 }
客户-订单(包括客户ID)-OrderPart-部件' p1 u# L5 M1 M+ B" G7 }. B
我想要一个有所有订单和每个订单及其零件的客户。
0 K9 f- S3 v, q4 Q! j现在,我有两个主要选择:5 M# ~( K, N% H! F) X6 w9 Y1 j  z
[ol]使用嵌套循环(产生单独查询)
5 f0 Q! u4 v$ D' w7 I使用数据加载选项(产生单个查询连接)[/ol]问题:6 z1 Y* l- I. d0 F' H
关于ORM大多数建议和示例都建议使用选项2,我能理解为什么。然而,选项2可能会发送大量重复的数据,例如:
: \, y+ q* Q  H0 V6 L. H, OOption 1 results (3 queries):% o% X/ `7 W. d' t2 ~  S* P) B
ID  Name       Country1   Customer1  UKID  Name1   Order12   Order2ID  Name1   Part12   Part23   Part3Option 2 results (1 query):! Z7 p7 V# c+ m! W
ID  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个字段,订单有更复杂的子连接,数据重复将很快变得巨大。
6 R. x8 ~1 h7 F; B对整体性能的影响如下:
: n. l: Q4 @6 o$ z) \建立数据库连接的费用: v4 ?/ [1 n8 @6 E; G
发送数据的时间(如果是在其他服务器上,则可能是跨网络)
& `, Y, [" N9 w2 G: O8 Q7 V带宽
选项2始终是最佳选择,选项1是最佳选择还是取决于情况?如有必要,应该用什么标准来确定?有足够的吗?ORM聪明地自己解决?
* a: f: y# Q; F1 P- U                                                                : E  G% c; `; w# W- B+ C0 L
    解决方案:                                                                ) z/ d9 @* T8 x; J% q( S2 o
                                                                建立数据库连接的费用如果它们位于通常的同一子网中,则很少。如果不是,那么这仍然不是很大的开销,可以通过大多数ORM克服缓存(NHibernate一级和二级缓存)。! g* K. k( \/ e' E
发送数据的时间(如果是在其他服务器上,则可能是跨网络)因为SELECTN 1显然会更长,因为它必须每次发送select句子最长可能长达1k。它还必须从池中获得新的连接。2002年至2003年使用Chatty与矮胖的声明一直是争论的焦点,但除非这是一个非常大的应用程序,否则现在就没有太大的不同了。在这种情况下,你可能希望有经验的(或更高的薪水)专家来表达他的观点。) x! r' t7 M. P! I* L- i4 N' H
-即顾问。
3 z* F$ X7 _" C" v# o然而,我希望加入连接,因为数据库将在10年或10年的开发过程中优化这种用法。如果性能真的很慢,View可以解决这个问题或存储过程。
) V; A$ Y1 U: F% `顺便说一句,SELECTN 1这可能是人们第一次使用它NHibernate最常见的性能问题(包括我自己),其实需要调整才能解决。这是因为NHibernate对ORM而言就像C
( L: W3 H  q8 Z2 `: P        和语言一样。+ o8 w* ]1 S+ e$ t
带宽SELECT每个对象的额外语句Customer最终会建立很多Customer对象* Orders。因此,对于大型系统来说,这可能很明显-' }7 E. k7 H: A) |* n" G/ v; |. M/ F
但就像我提到的,ORM通常有适当的缓存机制来消除这个问题。SELECT考虑到以下事实,句子的数量不会那么大:
, r9 k! J3 v7 |大多数情况下,你和SQL Server在同一网络上$ ^/ c* e" F' n2 t
字节数的增加会带来额外的0.5-50k额外带宽?想想大多数服务器有多快。
分享到:
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则