首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Hibernate抓取策略--什么时候使用"join“,什么时候使用"select"?

Hibernate抓取策略--什么时候使用"join“,什么时候使用"select"?
EN

Stack Overflow用户
提问于 2009-03-05 23:22:51
回答 6查看 47.7K关注 0票数 49

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

代码语言:javascript
复制
fetch="join|select"

其中"select“是默认值。

如何决定将哪个关联用于哪个关联?

我尝试将全部从"select“更改为"join”应用程序范围内生成的查询数量可能减少了10倍,但性能保持不变(甚至变得更差)。

谢谢。

EN

回答 6

Stack Overflow用户

回答已采纳

发布于 2009-03-06 05:14:43

Join被认为可以解决n+1问题。如果您有10个父级,每个父级都有10个子级,则join将需要一个查询,而select将需要11个查询(一个用于父级,一个用于每个父级的子级)。如果数据库与应用程序在同一台服务器上,或者如果网络非常快,这可能不是什么大问题,但如果每次数据库调用都有延迟,则可能会增加。join方法在初始查询中的效率稍低,因为您将在每一行中复制父列,但您只对数据库进行一次往返。

一般来说,如果我知道我需要所有父母的孩子,我会选择加入。如果我只需要几个父母的孩子,我会使用select。

票数 42
EN

Stack Overflow用户

发布于 2009-03-06 00:18:06

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

选择:

代码语言:javascript
复制
SELECT * FROM parent WHERE id=(whatever)
SELECT * FROM child WHERE id=(parent.child.id)

加入:

代码语言:javascript
复制
SELECT *
FROM parent
LEFT OUTER JOIN child ON parent.child.id=child.id
WHERE parent.id=(whatever)

至于何时使用一种而不是另一种...不是完全确定。这可能取决于数据库系统。如果其中一个总是比另一个更好,我怀疑他们会费心给你这个选择!如果你看到每一个都有相似的性能,我不会担心。

票数 9
EN

Stack Overflow用户

发布于 2015-04-25 04:34:58

如果父母有很多孩子,而这些孩子又有很多其他孩子,那么在这种情况下,最初的“加入”可能会阻塞网络。我的建议是在这种情况下使用'select‘来拆分select。

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/617145

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档