当前位置:  开发笔记 > 运维 > 正文

Hibernate获取策略 - 何时使用"join"以及何时使用"select"?

如何解决《Hibernate获取策略-何时使用"join"以及何时使用"select"?》经验,为你挑选了2个好方法。

大多数Hibernate关联都支持"fetch"参数:

fetch="join|select"

"select"是默认值.

如何决定使用哪一个关联?

我尝试将所有内容从"选择"更改为"加入"应用程序范围 - 生成的查询数量减少了10倍,但性能保持完全相同(甚至变得更糟糕).

谢谢.



1> Brian Deterl..:

加入应该解决n + 1问题.如果您有10个父母,每个父母有10个孩子,则加入将需要一个查询,并且选择将需要11个(一个用于父母,一个用于每个父母的子女).如果数据库与应用程序位于同一服务器上,或者网络速度非常快,那么这可能不是什么大问题,但如果每个数据库调用都有延迟,则可以相加.join方法在初始查询上的效率稍差,因为您复制了每一行中的父列,但您只对数据库进行了一次往返.

一般来说,如果我知道我需要所有父母的孩子,我就去加入.如果我只需要几个父母的孩子,我会选择.


嗯,我在生产上尝试过它(我们有带奴隶的远程数据库服务器)和行为保持完全相同 - 比"选择"稍差一点.为了帮助解决n + 1问题,我们使用"default_batch_fetch_size",因此它将批量运行select查询,而不是逐个运行.

2> jdmichal..:

Select将通过向数据库发出新查询来获取子项.Join将通过将子项添加到父查询中来获取子项.这就是为什么你看到类似的性能,即使查询数量下降.

选择:

SELECT * FROM parent WHERE id=(whatever)
SELECT * FROM child WHERE id=(parent.child.id)

加入:

SELECT *
FROM parent
LEFT OUTER JOIN child ON parent.child.id=child.id
WHERE parent.id=(whatever)

至于什么时候使用一个...不完全确定.它可能取决于数据库系统.如果一个总是比另一个好,我怀疑他们会费心给你选择!如果你看到每个人都有类似的表现,我不会担心.

推荐阅读
郑谊099_448
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有