iT邦幫忙

0

[筆記] Spring Data JPA 的 N+1 Problem (3)

timm 2022-10-08 02:48:081426 瀏覽
  • 分享至 

  • xImage
  •  

這一篇我們就切入 JPA 中的 N+1 Query 來做探討

什麼是 JPA 中的 N+1 Query

本可以使用一句 SQL 就完成查詢的需求,但因為其餘 Related Association 沒有跟著被查詢出來,而導致被迫多執行 N 次查詢所導致的現象。

為何這樣的行為,會降低查詢的效能

查詢本身是非常簡單的,但是往返資料庫之間的時間,卻遠遠超過查詢本身所需要的成本。

如何判斷是不是遇到 N+1 Query 了呢?

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 做分享。


圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言