카테고리 없음

[JPA] N+1 이슈

extra_ 2022. 12. 20. 21:53

 

Member, Order 엔티티에서 

 

  • 즉시로딩, entityManager
    • 쿼리 두번 조회가 아닌 조인 사용

 

  • 즉시로딩, JPQL
    •  쿼리 두번 조회

 

  • 지연로딩, JPQL
    •  주문 컬렉션은 조회되지 않고 지연됨(n개의 쿼리는 나중에라도 실행됨)
    •  LAZY로딩은 해결방안이 아님

 

  •  페치조인, JPQL
    •  inner join으로 조회됨 (해결)
    •  일대다 조인을 사용했으므로 distinct를 사용해 중복을 제거하는 것이 좋음

 

  • hibernate에서 제공하는 @BatchSize 어노테이션
    • in( ?, ?, ...) 절을 사용해서 조회
    • (size=n) 을 설정할 수도 있고 properties 파일에서 설정할 수도 있다.

 

 

  • hibernate에서 제공하는 @Fetch(FetchMode.SUBSELECT)
    • 즉시로딩, 지연로딩 둘 다 가능
    • subselect 쿼리 -> where 절 안에 select를 다시 사용해서 조회한다.

 

  •  @OneToOne, @ManyToOne : 기본 전략이 즉시로딩 -> 지연로딩으로 바꿔서 성능최적화를 이끌어내기
  •  @OneToMany, @ManyToMany : 기본 전략이 지연로딩