回答

收藏

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

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

也有类似的问题,但我认为没有人问过这个特定的问题。1 }% y! L" |$ F. O* p+ Q2 b* y! `% M
设想:
0 t9 j. `" V- W* |1 X客户-订单(包括客户ID)-OrderPart-部件
) o0 \1 \- I6 z. S我想要一个有所有订单和每个订单及其零件的客户。5 S6 k. l$ s9 m  s
现在,我有两个主要选择:
+ {3 t& O5 p3 b+ }3 A1 a6 O[ol]使用嵌套循环(产生单独查询): Q8 `. ?+ A/ N. p  B
使用数据加载选项(产生单个查询连接)[/ol]问题:% j" o6 Y+ Z" E
关于ORM大多数建议和示例都建议使用选项2,我能理解为什么。然而,选项2可能会发送大量重复的数据,例如:1 o$ c% z8 ^  M! b; _
Option 1 results (3 queries):0 X( d7 ^$ l/ h" t
ID  Name       Country1   Customer1  UKID  Name1   Order12   Order2ID  Name1   Part12   Part23   Part3Option 2 results (1 query):
* U$ v1 T, Z' z4 E* I0 _- v0 n0 mID  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个字段,订单有更复杂的子连接,数据重复将很快变得巨大。
% O: ~: O1 g4 S3 ]5 C# }5 c# [对整体性能的影响如下:
# P& A/ T) h" S建立数据库连接的费用( R0 |# O7 L! t+ X; r  v: ~
发送数据的时间(如果是在其他服务器上,则可能是跨网络)
# u. w# m# a8 T' A$ j& ~: y5 T; A带宽
选项2始终是最佳选择,选项1是最佳选择还是取决于情况?如有必要,应该用什么标准来确定?有足够的吗?ORM聪明地自己解决?
7 z" y" y2 g# R4 i' |' [1 e& L                                                                $ w  @2 `1 n! s- x; V/ C( k1 y: c: L
    解决方案:                                                                $ @" e! z4 n! L1 o+ m
                                                                建立数据库连接的费用如果它们位于通常的同一子网中,则很少。如果不是,那么这仍然不是很大的开销,可以通过大多数ORM克服缓存(NHibernate一级和二级缓存)。
/ s7 `* G) k2 y/ N" p! R* p( |发送数据的时间(如果是在其他服务器上,则可能是跨网络)因为SELECTN 1显然会更长,因为它必须每次发送select句子最长可能长达1k。它还必须从池中获得新的连接。2002年至2003年使用Chatty与矮胖的声明一直是争论的焦点,但除非这是一个非常大的应用程序,否则现在就没有太大的不同了。在这种情况下,你可能希望有经验的(或更高的薪水)专家来表达他的观点。
2 U9 Z$ B. u. m5 s1 `-即顾问。
3 ~  V7 C8 F- U. l然而,我希望加入连接,因为数据库将在10年或10年的开发过程中优化这种用法。如果性能真的很慢,View可以解决这个问题或存储过程。
7 X8 [& h  |7 Y/ F/ l: D# \顺便说一句,SELECTN 1这可能是人们第一次使用它NHibernate最常见的性能问题(包括我自己),其实需要调整才能解决。这是因为NHibernate对ORM而言就像C
# d% {4 H& C+ _( {        和语言一样。* _' Q( P  C* J5 r6 `; y, a4 f  I
带宽SELECT每个对象的额外语句Customer最终会建立很多Customer对象* Orders。因此,对于大型系统来说,这可能很明显-: `; E) X' t( q% |/ a' n7 x- Y
但就像我提到的,ORM通常有适当的缓存机制来消除这个问题。SELECT考虑到以下事实,句子的数量不会那么大:
! m: H: Q# x4 _7 J1 s8 C大多数情况下,你和SQL Server在同一网络上9 e8 U! ^* n. b  u( Y) M. X
字节数的增加会带来额外的0.5-50k额外带宽?想想大多数服务器有多快。
分享到:
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则