sql - 为什么 Jpa N+1 这么糟糕?
问题描述
我知道我们必须避免这种行为,使用 join fetch 而不是让 JPA 通过进行多个查询来管理它,但问题是:为什么它的性能如此糟糕,因为我们在同一个会话中调用所有查询?
示例:
Select * from person Select * from accounts
Select * from person p left join fetch p.accounts
我的问题只是关于性能,最后一个更具性能的理由是什么?
谢谢
解决方案
因为在运行查询时不仅仅是检索数据。其他阶段可能非常昂贵。仅举几例:
- 准备连接。
- 查询通过线路发送到数据库服务器。
- 数据库引擎解析查询。缓存已填充。
- 数据库引擎重写/改写查询以满足内部需求。
- 检查缓存。否则被填充和管理。
- db 引擎评估查询的多个执行计划。
- 数据库引擎以某种方式选择最佳执行计划。
- 运行查询,检索数据,这会产生 I/O 后果。
- 结果集通过线路返回。
您可能认为查询只包括查询运行阶段,而实际上数据库正在执行许多其他任务。
此外,一旦单个 I/O 操作一次检索多行,您将不必要地丢弃其中的许多行。
推荐阅读
- docker - SQLSTATE [HY000] [2002] 在 travis 上使用 docker-compose 拒绝连接仅用于 symfony phpunit 测试
- ruby - ruby 中未定义的局部变量或方法“action_name”错误
- javascript - 使用反应路由器后图像滑块不起作用
- solr - 如何在 Mac OS 上安装 Apache Solr?
- c# - dotNetRDF 的 RDFS Reasoner 是否支持多个超类类型推断?
- mongodb - spring boot 无法检索 gridfs
- python - Qt Desiger 向导添加新页面
- android - Android WorkManager *偶尔*在应用程序崩溃后停止调度作业
- java - Kafka AvroSchema 未生成,当类具有数据类型为对象类的字段时
- bcc-bpf - 无法运行 bcc-tools 分析器