当前位置: 首页 > news >正文

Hibernate关联查询N+1查询问题记录

一、问题起因:线上某个列表的查询效率低下,需要定位下具体原因
二、定位过程:

1、因为问题出现之前有增加一个需求,查询会对表中某个json字段进行过滤,所以第一时间怀疑是数据量大了以后这种json内容筛选导致的,但测试后发现其影响关系不大,效率依然低。

2、转而怀疑是列表查询关联了一张子表导致,分析查看log日志后,发现一个之前没注意到的情况,一次查询竟然打印了很多条查询sql日志,这才看到Hibernate关联查询时,是先查询主表,拿到关联主键后,对每个子表单独请求一次数据库的,导致查询效率极其低下。

三、解决方案:

对于级联字段上添加注解,@BatchSize(size = n),其中n代表列表的返回条数。

 一、@BatchSize 的实际行为

1、动态批量查询

如果主表返回 10条数据,Hibernate 会生成类似以下SQL一次性加载这10条对应的子表数据: 

SELECT * FROM sub_table WHERE main_id IN (1, 2, 3, ..., 10);

 如果主表返回 15条数据size=20),则同样执行一次 IN (1, 2, ..., 15) 查询。

2、不足size时的处理

  • size 只是 批量加载的上限值,并非必须凑满。

  • Hibernate 会根据实际需要加载的主表ID数量动态生成SQL,不会补空值或报错。

 

相关文章:

  • Redis的下载安装和使用(超详细)
  • Dify vs n8n vs RAGFlow:2025年AI应用与自动化工作流平台的终极对决
  • 趣味编程之分布式系统:负载均衡的“雨露均沾“艺术
  • vue3项目本地开启https协议访问(vite)
  • 1.凸包、极点、极边基础概念
  • STM32F103RCT6开发板无法调试问题
  • C语言链接数据库
  • ReadableStream响应主体数据处理(截图自用)
  • [net 6] udp_chat_server基于udp的简单聊天室(多线程的服务器与业务相分离)
  • C++11_2
  • 信息学奥赛一本通 1622:Goldbach’s Conjecture | 洛谷 UVA543 Goldbach‘s Conjecture
  • 【HDFS入门】HDFS与Hadoop生态的深度集成:与YARN、MapReduce和Hive的协同工作原理
  • 深度监听 ref 和 reactive 的区别详解
  • Spring Boot 实现 Excel 导出功能(支持前端下载 + 文件流)
  • ⭐ Unity 使用Odin Inspector增强编辑器的功能:UIManager脚本实例
  • React 对state进行保留和重置
  • 【gpt生成-其一】以go语言为例,详细描述一下 ​:语法规范​​BNF/EBNF形式化描述
  • 基于深度学习并利用时间信息在X射线血管造影中进行冠状动脉血管分割|文献速递-深度学习医疗AI最新文献
  • 【gpt生成-总览】怎样才算开发了一门编程语言,需要通过什么测试
  • 【OSCP-vulnhub】GoldenEye
  • “马上涨价”再到“吞下关税”,美政策让沃尔玛“输两次”
  • 北方首场高温将进入鼎盛阶段,江南华南多地需警惕降雨叠加致灾
  • 芬兰直升机相撞坠毁事故中五名人员全部遇难
  • 摄影师|伊莎贝尔·穆尼奥斯:沿着身体进行文化溯源
  • 南宁一学校发生伤害案件,警方通报:嫌疑人死亡,2人受伤
  • 张国清将赴俄罗斯举行中俄“长江—伏尔加河”地方合作理事会第五次会议和“东北—远东”政府间合作委员会双方主席会晤