ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • N+1 쿼리 문제란?
    Java/Spring-JPA 2020. 7. 27. 11:47

     

     

    N+1 쿼리 문제란?

    1:N 관계인 두 엔티티가 있을 때, 1에 해당하는 엔티티를 

     

    N+1 in Lazy Loading

     

    N+1 in Eager Loading

    FetchType을 변경하는 것은 단지 N+1 발생 시점을 연관관계 데이터를 사용하는 시점으로 미룰지, 아니면 초기 데이터 로드 시점에 가져오느냐에 차이만 있는 것

     

    N+1이 발생하는 이유?

    JPQL 입장에서는 즉시 로딩, 지연 로딩과 같은 글로벌 패치 전략을 무시하고 JPQL만 사용해서 SQL을 생성합니다.

     

    N+1 해결책 1 :: Fetch Join

    가장 많이 사용하는 방법

    페치 조인을 사용하게 되면 연관된 엔티티는 프록시가 아닌 실제 엔티티를 조회하게 되므로 연관관계 객체까지 한 번의 쿼리로 가져올 수 있습니다.

     

    N+1 해결책 2 :: @BatchSize

    BatchSize는 연관관계의 데이터 사이즈를 정확하게 알 수 있다면 최적화할 수 있는 size를 구할 수 있겠지만 사실상 연관 관계 데이터의 최적화 데이터 사이즈를 알기는 쉽지 않다.

     

    N+1 해결책 3 :: @Fetch(FetchMode.SUBSELECT)

     

    N+1 해결책 4 :: @EntityGraph

     

    N+1 해결책 5 :: QueryBuilder

    'Java > Spring-JPA' 카테고리의 다른 글

    final Class는 왜 JPA Entity가 될 수 없을까?  (0) 2021.01.31
    JPA(Java Persistence Api) - 입문  (0) 2019.04.06

    댓글

Designed by Tistory.