大多数Hibernate关联都支持"fetch“参数:
fetch="join|select"其中"select“是默认值。
如何决定将哪个关联用于哪个关联?
我尝试将全部从"select“更改为"join”应用程序范围内生成的查询数量可能减少了10倍,但性能保持不变(甚至变得更差)。
谢谢。
发布于 2009-03-06 05:14:43
Join被认为可以解决n+1问题。如果您有10个父级,每个父级都有10个子级,则join将需要一个查询,而select将需要11个查询(一个用于父级,一个用于每个父级的子级)。如果数据库与应用程序在同一台服务器上,或者如果网络非常快,这可能不是什么大问题,但如果每次数据库调用都有延迟,则可能会增加。join方法在初始查询中的效率稍低,因为您将在每一行中复制父列,但您只对数据库进行一次往返。
一般来说,如果我知道我需要所有父母的孩子,我会选择加入。如果我只需要几个父母的孩子,我会使用select。
发布于 2009-03-06 00:18:06
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)至于何时使用一种而不是另一种...不是完全确定。这可能取决于数据库系统。如果其中一个总是比另一个更好,我怀疑他们会费心给你这个选择!如果你看到每一个都有相似的性能,我不会担心。
发布于 2015-04-25 04:34:58
如果父母有很多孩子,而这些孩子又有很多其他孩子,那么在这种情况下,最初的“加入”可能会阻塞网络。我的建议是在这种情况下使用'select‘来拆分select。
https://stackoverflow.com/questions/617145
复制相似问题