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

问题描述 投票:2回答:1

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

示例:

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

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

谢谢

sql jpa
1个回答
2
投票
因为在运行查询时,不仅检索数据。其他阶段可能会非常昂贵。仅举几例:

    准备连接。
  1. 查询通过导线发送到数据库服务器。
  2. 数据库引擎解析查询。缓存已填充。
  3. 数据库引擎重写/重新定义查询以适合内部需求。
  4. 已检查缓存。否则将进行填充和管理。
  5. 数据库引擎为查询评估多个执行计划。
  6. 数据库引擎以某种方式选择
  7. 最优执行计划。
  8. <,将检索数据,这会带来I / O后果。
  9. 结果集通过电线返回。
您可能已经考虑到查询仅包括
  • query is run
  • 阶段,而实际上,数据库正在执行许多其他任务。

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

    © www.soinside.com 2019 - 2024. All rights reserved.