Notice
Recent Posts
Recent Comments
Link
DevKim
[Data JPA] 페이징 성능 최적화 - Count 쿼리 분리하기 본문
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
'JPA' 카테고리의 다른 글
[Querydsl] Querydsl VS. JPQL (11) | 2021.07.21 |
---|---|
[Data JPA] 벌크성 수정쿼리, @EntityGraph (0) | 2021.07.01 |
[Data JPA] 페이징과 정렬 (0) | 2021.07.01 |
[Data JPA] 쿼리 메소드 기능 (@Query, 파라미터 바인딩..등) (0) | 2021.07.01 |
[JPA] JPQL 문법 정리 (0) | 2021.06.24 |