Batch Size를 이용한 N+1 문제 완화

song yuheon·2023년 10월 3일

JPA

목록 보기
6/9
post-thumbnail

Batch Size를 이용한 N+1 문제 완화


Batch Size란?


batch size는 ORM의 기능 중 하나로 여러 연관된 엔터티를 한 번의 쿼리로 로딩할 수 있게 해주는 설정이다.
A 엔터티와 연관된 여러 B 엔터티들이 있을 때 각 A를 조회할 때마다 연관된 B들을 로딩하는 것이 아니라 설정된 batch size만큼의 B를 한 번에 로딩한다.
결과적으로 쿼리 수를 줄일 수 있다.


Fetch Join과 Batch Size

두 기능 모두 N+1 문제를 완화하는 방법이지만 사용하는 상황과 특성이 다르다

  • Fetch Join
    연관된 엔터티를 단 한 번의 쿼리로 함께 로딩한다.
    큰 데이터 세트에서는 중복 데이터가 발생할 수 있다.
  • Batch Size
    지연 로딩을 사용하되 설정된 크기만큼의 연관된 엔터티를 한 번의 쿼리로 로딩한다.

=> batch size를 사용한다고 fetch join의 필요성이 사라지는 것은 아니다.
각 상황에 맞는 전략을 선택해야 한다.


작동 방식


batch size = 10일때
조건
member 100 명 조회
member은 team 보유

  1. 100명의 Member 엔터티를 조회한다.

  2. 처음 Member 100명을 select로 조회하면서 각 Memberteam_id를 확보한다.

  3. 이후 특정 MemberTeam 정보가 필요하게 되면 현재 로딩이 필요한 Member로부터 batch size로 설정된 수 (=10) 만큼의 team_id에 해당하는 Team 엔터티들을 한 번의 쿼리로 조회한다.

  4. 그 후 영속성 컨텍스트를 확인하여 필요한 Team 엔터티가 없으면 다음 batch size만큼의 Team 엔터티들을 다시 조회한다.

  5. 이 과정이 반복된다.

  • Plus 이렇게 IN 절을 활용해 한 번의 쿼리로 여러 Team을 조회하므로 N+1 문제를 효과적으로 완화할 수 있다.

profile
backend_Devloper

0개의 댓글