Java Hibernate 复杂实体关联下,简单查询都很慢,如何优化?

324 天前
 XiaoJiang9527

最近正在整改一个老项目,里面的表结构错综复杂,实体中的映射表字段基本都增加了 @ManyToOne 和 @JoinColumn 注解,导致很多简单单表查询都需要执行很久。 但是打印具体 hibernate SQL 日志,Explain 下,也不存在什么性能问题,各位大佬们,怎么解?

5724 次点击
所在节点    程序员
65 条回复
issakchill
324 天前
是不是查单表的时候 也自动遍历关联查了关联表的数据?
nothingistrue
324 天前
没 DDD 小聚合,或者类似的数据模型,不要用 Hibernate 。当然就算是用了 DDD ,也是用通过读写分离,来避开复杂查询的。
BiChengfei
324 天前
我不用 @ManyToOne 和 @JoinColumn ,都是在代码中手动关联查询,感觉这两个注解隐藏了太多细节。sql 都有了,就一个流程一个流程看呗,要么数据多,要么流程多
XiaoJiang9527
324 天前
@issakchill 没错,一个简单查询能打印 6 条查询语句,有一个 SQL 甚至 JOIN 了 9 张表
XiaoJiang9527
324 天前
@nothingistrue 看来复杂查询只能全部拆分成原生 SQL 去解决了。
XiaoJiang9527
324 天前
@BiChengfei 流程一个一个看,给我震惊的不行,一个 hibernate 的 Query 方法,能打印 6 条查询语句 !!!
nothingistrue
324 天前
1 ,数据库弄个视图,然后单独给这个试图搞个纯查询的实体吧。2 ,如果 1 不可行,跑路。

这么多关联,你这是个屁的简单查询。
nothingistrue
324 天前
数据模型太烂,上谁都管不了。换成 SQL 也是复杂 SQL ,可能更慢。
yor1g
324 天前
@ManyToOne 都开延迟 按需返回字段
shyangs
324 天前
JOIN 了 9 張表, 不能算簡單查詢吧.

你可以試試手寫 SQL, 9 表 JOIN , 看能提升多少.
lybcyd
324 天前
是不是 N+1 ,看看语句具体是怎么关联的
Sigrdirfa
324 天前
简单查询在我的概念里最狭义的是单表与其所对应的 Java 对象进行 crud 操作,稍微宽泛一点的是和一到两张有关联关系的表(关联表无其他与其关联表需要被查询)进行连表查询。

你这个对象是不是过于复杂了?
XiaoJiang9527
324 天前
@nothingistrue 在 Hibernate 里面,我把 "service.queryData(conditionBean);" 称之为一个单表查询。
XiaoJiang9527
324 天前
@nothingistrue 我也非常担心更改原生 SQL 后,更为糟糕。
XiaoJiang9527
324 天前
@yor1g 实体之间的关系绑定,hibernate 好像没办法按需返回所需字段吧?
XiaoJiang9527
324 天前
@lybcyd 打印出的 SQL ,用来分析,确实点问题没有,都是类似主外键查询,也是正常走的索引,就是极慢。一个接口能打印 30 个 SQL 。
XiaoJiang9527
324 天前
@Sigrdirfa 数据模型太烂了,写的也烂。
XiaoJiang9527
324 天前
@shyangs 还别说,手写 9 个表 join 查询 0.2 s ,跟 hibernate 输出的 SQL 基本一致。
Sanshi4396
324 天前
直接在 Repo 里用 @Query 写原生 sql 语句,查询你想要的东西呗,不要用它的方法查询。
如果原生 sql 都很慢,那不能怪 hibernate 了。
Sanshi4396
324 天前
还有你的查询是不是返回了 Page<>分页对象。这个对象返回的时候,是会多次查询的。
1 、查询你想要的单页数据 2 、查询数据总数

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/1013581

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX