为什么Jpa N + 1太糟糕了?

时间:2019-12-23 23:31:11

标签: sql jpa

我知道我们必须避免这种行为,使用联接获取而不是让JPA通过执行多个查询来管理它,但是问题是:为什么由于在同一会话中调用所有查询,所以它的性能如此差?

示例:

  1. Select * from person 
    Select * from accounts
    
  2. Select * from person p left join fetch p.accounts
    

我的问题只是关于性能,最后一个的理由是什么更具表现力?

谢谢

1 个答案:

答案 0 :(得分:2)

因为运行查询时不仅检索数据。其他阶段可能会非常昂贵。仅举几例:

  1. 准备连接。
  2. 查询通过导线发送到数据库服务器。
  3. 数据库引擎解析查询。缓存已填充。
  4. 数据库引擎重写/重新定义查询以适合内部需求。
  5. 已检查缓存。否则将进行填充和管理。
  6. 数据库引擎为查询评估多个执行计划。
  7. 数据库引擎以某种方式选择最优执行计划。
  8. 运行查询,检索数据,这会带来I / O后果。
  9. 结果集通过电线返回。

您可能已经考虑到查询仅包括查询运行阶段,而实际上,数据库正在执行许多其他任务。

此外,一旦单个I / O操作立即检索到许多行,您将不必要地丢弃其中的许多行。