這一篇我們就切入 JPA 中的 N+1 Query 來做探討
本可以使用一句 SQL 就完成查詢的需求,但因為其餘 Related Association 沒有跟著被查詢出來,而導致被迫多執行 N 次查詢所導致的現象。
查詢本身是非常簡單的,但是往返資料庫之間的時間,卻遠遠超過查詢本身所需要的成本。
Entity Relation,作家(author) 和 書(book) 有著 OneToMany 的關係,並使用 Spring Data JPA (JpaRepository)
@Repository
public interface AuthorRepository extends JpaRepository<City, Long> {
}
執行下方程式碼的時候
authorRepository.findAll().forEach(Author::getBooks);
Console Log
select * from author;
select * from book where author_id = ?;
select * from book where author_id = ?;
...
select * from book where author_id = ?;
上述對於 book 的查詢次數會相等於 select * from author;
所查詢到的數量。
因為這些 author record 被查詢出來的時候,都並未攜帶所屬的 book records
,會發生這樣的情況,主要是因為 JPA 定義中的 OneToMany
關係中 FetchType 屬於 LAZY
,並不會跟著 Parent Entity
一起被查詢出來,都得等到需要使用的時候才會進資料庫進行查詢。
下一篇將會在針對 FetchType LAZY and EAGER 做分享。