首页 > 解决方案 > 为什么 Jpa N+1 这么糟糕?

问题描述

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

示例:

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

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

谢谢

标签: sqljpa

解决方案


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

  1. 准备连接。
  2. 查询通过线路发送到数据库服务器。
  3. 数据库引擎解析查询。缓存已填充。
  4. 数据库引擎重写/改写查询以满足内部需求。
  5. 检查缓存。否则被填充和管理。
  6. db 引擎评估查询的多个执行计划。
  7. 数据库引擎以某种方式选择最佳执行计划。
  8. 运行查询,检索数据,这会产生 I/O 后果。
  9. 结果集通过线路返回。

您可能认为查询只包括查询运行阶段,而实际上数据库正在执行许多其他任务。

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


推荐阅读