Sql 为什么Jpa N+;有那么糟糕的事情吗?

Sql 为什么Jpa N+;有那么糟糕的事情吗?,sql,jpa,Sql,Jpa,我知道我们必须避免这种行为,使用join-fetch,而不是让JPA通过进行多个查询来管理它,但问题是:既然我们在同一个会话中调用所有查询,为什么性能如此糟糕? 范例: 我的问题是关于性能,最后一个的理由是什么 谢谢,因为在运行查询时,不仅仅是检索数据。其他阶段可能相当昂贵。举几个例子: 准备连接 查询通过线路发送到数据库服务器 数据库引擎解析查询。缓存已填充 db引擎重写/重新表述查询以满足内部需求 缓存已被检查。否则将填充和管理 db引擎评估查询的多个执行计划 db引擎以某种方式选择最佳

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

范例:

  • 我的问题是关于性能,最后一个的理由是什么


    谢谢

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

  • 准备连接
  • 查询通过线路发送到数据库服务器
  • 数据库引擎解析查询。缓存已填充
  • db引擎重写/重新表述查询以满足内部需求
  • 缓存已被检查。否则将填充和管理
  • db引擎评估查询的多个执行计划
  • db引擎以某种方式选择最佳执行计划
  • 运行查询,检索数据,这会产生I/O后果
  • 结果集通过导线返回
  • 您可能认为查询只包含在运行查询阶段,而实际上数据库正在执行许多其他任务


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

    我不理解您的观点,我很感激。.但是,由于我们在同一个会话中与JPA合作,我认为我们不需要准备连接,还要担心你所经历的大部分阶段describem@BrunoSerqueira如果你使用的是“连接池”(你可能是因为JPA),你不需要考虑步骤1。但是,您仍然受到所有其他步骤的影响。
    Select * from person 
    Select * from accounts
    
    Select * from person p left join fetch p.accounts