回答

收藏

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

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

也有类似的问题,但我认为没有人问过这个特定的问题。
6 T/ B4 L. P  u8 j" n; M; {% k$ e设想:' E1 `! a) a! h1 |2 U: F7 f, w6 e
客户-订单(包括客户ID)-OrderPart-部件
/ p0 Y! Z! I. T4 G1 F6 A9 `. C我想要一个有所有订单和每个订单及其零件的客户。
* E% p& O9 ?8 [' [: n' W现在,我有两个主要选择:, `5 L9 x; H% |8 W3 b
[ol]使用嵌套循环(产生单独查询)0 [& ~2 O/ j9 u# W6 @) g9 {
使用数据加载选项(产生单个查询连接)[/ol]问题:
5 W5 f" {* o* i# y  V关于ORM大多数建议和示例都建议使用选项2,我能理解为什么。然而,选项2可能会发送大量重复的数据,例如:. {5 O2 I3 n8 o( k, i- }
Option 1 results (3 queries):
- o9 ?; M/ B. K) d' rID  Name       Country1   Customer1  UKID  Name1   Order12   Order2ID  Name1   Part12   Part23   Part3Option 2 results (1 query):
4 V( _3 ~" a! [0 C; l& w; OID  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个字段,订单有更复杂的子连接,数据重复将很快变得巨大。5 T. Q  q7 U; Z1 X8 Q; r) w
对整体性能的影响如下:
9 p' E) Q% F* K" ]! W建立数据库连接的费用% p; W7 F0 I  g# W6 H- f
发送数据的时间(如果是在其他服务器上,则可能是跨网络)4 }/ V' O6 ]9 C6 v) J  v
带宽
选项2始终是最佳选择,选项1是最佳选择还是取决于情况?如有必要,应该用什么标准来确定?有足够的吗?ORM聪明地自己解决?
' p8 v7 S6 d+ }# U. f9 h7 ]                                                                2 K9 D3 T3 }1 T+ Z# N$ d: h1 l
    解决方案:                                                               
7 W7 P7 O4 K8 `( v4 l                                                                建立数据库连接的费用如果它们位于通常的同一子网中,则很少。如果不是,那么这仍然不是很大的开销,可以通过大多数ORM克服缓存(NHibernate一级和二级缓存)。
) a- w8 a0 `* k6 `+ U9 ]1 w发送数据的时间(如果是在其他服务器上,则可能是跨网络)因为SELECTN 1显然会更长,因为它必须每次发送select句子最长可能长达1k。它还必须从池中获得新的连接。2002年至2003年使用Chatty与矮胖的声明一直是争论的焦点,但除非这是一个非常大的应用程序,否则现在就没有太大的不同了。在这种情况下,你可能希望有经验的(或更高的薪水)专家来表达他的观点。( V/ ?& i  p& L2 S9 q. n
-即顾问。8 q6 ?5 W- f8 a
然而,我希望加入连接,因为数据库将在10年或10年的开发过程中优化这种用法。如果性能真的很慢,View可以解决这个问题或存储过程。
6 e8 K( A* o4 W  M1 q: Q1 w2 {顺便说一句,SELECTN 1这可能是人们第一次使用它NHibernate最常见的性能问题(包括我自己),其实需要调整才能解决。这是因为NHibernate对ORM而言就像C
( ~: `8 p% D1 d( v$ |/ G% x3 ]$ y        和语言一样。6 {: J) t8 A7 i4 B
带宽SELECT每个对象的额外语句Customer最终会建立很多Customer对象* Orders。因此,对于大型系统来说,这可能很明显-/ ]1 G6 \2 m, D2 p
但就像我提到的,ORM通常有适当的缓存机制来消除这个问题。SELECT考虑到以下事实,句子的数量不会那么大:
* L! ?" |# U) O: ]2 d5 e大多数情况下,你和SQL Server在同一网络上& _2 N( B2 E2 N* Z2 F* A) j
字节数的增加会带来额外的0.5-50k额外带宽?想想大多数服务器有多快。
分享到:
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则