DevKim

[Data JPA] 페이징 성능 최적화 - Count 쿼리 분리하기 본문

JPA

[Data JPA] 페이징 성능 최적화 - Count 쿼리 분리하기

on_doing 2021. 7. 1. 16:49
728x90

실무에선, Total Count 쿼리 때문에 성능이 안나오는 경우도 있기 때문에,Page 쓰는걸 고려해봐야한다고 한다.

성능 테스트해보고 성능 안나오면 count 쿼리를 분리해보자!

 

< 문제점 >

 total count 쿼리는 어쨌든 DB에 있는 모든 데이터를 카운트해야하므로 매우 무겁다.

 

member와 team이 양방향 연관관계가 걸려있는 상황일 때,

member를 가져올 때, 어쨌든 데이터를 쿼리하는건 team을 같이 조인해서 가져와야한다.

@Query(value = "select m from Member m left join m.team t")
Page<Member> findPageByAge(int age,Pageable pageable);

다음을 실행시키면 이런 쿼리로그를 볼 수 있다.

select 쿼리에서 join을 하는데, count 쿼리에서 한번 더 join을 해주고 있는 것이다.

사실 total count 할 땐, left out 조인 할 필요가 전혀 없다.

-> 데이터가 많고 복잡해지면 성능이 나오지 않을 수 밖에 없다


< 해결 방법 >

** Query 직접 짜서 count 쿼리 분리하기 **

@Query(value = "select m from Member m left join m.team t",
            countQuery = "select count(m) from Member m")
Page<Member> findPageByAge(int age,Pageable pageable);

다음과 같이, countQuery를 분리해주면 select 할 때 join이 한번 일어난다.

카운트 쿼리가 굉장히 심플해졌다.

오예!

728x90
Comments