본문 바로가기

개발이야기

JPA batchSize 설정 해도 N+1 쿼리가 발생 해요

반응형

JPA batchSize 설정 해도 N+1 쿼리가 발생 해요~ 라고 지인이 물어봐서 같이 디버깅을 해줬다. 

Entity 매핑은 ManyToOne 양방향 관계로 가장 심플한 구조다. 

OneToMany 관계 조회시 N+1 쿼리가 발생하지 않도록 BatchSize를 설정했는데 

어떨때는 batchSize 설정한 만큼 inQuery가 잘 실행 되는데 

어떨때는 inQuery가 N번 발생하는 이상한 케이스 였다. 

 

문제원인>

select * from entity limit 10 과 같이 10건의 데이터를 조회 하고 batchSize 설정대로 In query가 수행 되었다.

하지만  oneToMany 관계의 테이블에 데이터가 제대로 들어가 있지 않아서 inQuery 결과 값이 제대로 연결이 안됨

아마도 entityManager가 10건의 result를 차례대로 돌면서 검증(?) 절차를 거치는듯. 

자식객체 값이 제대로 매핑이 되지 않은 결과 값을 발견하면 batchSize설정 대로 inQuery가 한번 더 발생 함. 

즉, 결과 값이 10건 이면  실제 조회 쿼리 1번 + inQuery 1번 + 검증 하면서  10번의 inQuery 발생함 

N+2 만큼 쿼리 실행 됨 -_-;; 

 

관계 테이블에 데이터를 제대로 입력하니 문제 해결 ! 

자식 객체의 데이터가 없는 경우도 있다고 하길래 그럼 더미 값이라도 디폴트로 입력 하거나 비정규화를 하라고 조언해줌. 

반응형