JPA exists 쿼리 성능 및 queryDsl 구현
개발을 하다보면, 데이터가 유무를 판별하는 경우가 많다.
보통은 size(), count, exists 중에서 데이터의 유무를 판별하게 되는데,
어떤것을 사용하는게 성능이 더 좋을까???
size()는 모든 데이터를 select을 해야하는 부분이 있어서 성능이 안나온다고 생각했었다.
하지만, count vs exists는 크게 생각을 안해본거 같아서 정리해본다.
count는 총 몇건인지 확인을 하기 위해 전체를 확인해봐야하고,
exists는 첫번째 결과에서 바로 true를 리턴하게 된다.
'exists가 count보다 성능이 좋은 이유가 결국 전체를 조회하지 않고 첫번째 결과만 확인하기 때문이다.'
하지만,
exists는 @Query에서 사용할 수 없으므로 Querydsl을 사용해야한다.
아래는 Querydsl로 직접 exists를 구현한 내용이다.
limit로 1개만 조회하고 해당 데이터가 있는지 없는지 판단한다.
public Boolean existsErrScrap(SchScrapRequestDto requestDto, BatchStatus status) {
return jpaQueryFactory.select(schScrapErrHist.id)
.from(schScrapErrHist)
.where(
schScrapErrHist.id.orgCd.eq(requestDto.getOrgCd()),
schScrapErrHist.id.svcCd.eq(requestDto.getSvcCd()),
schScrapErrHist.status.eq(status)
).fetchFirst() != null;
}