본문 바로가기

공부 기록/영상 후기

[우아콘2020] 수십억건에서 QUERYDSL 사용하기

https://youtu.be/zMAX7g6rO_Y

- JPAQueryFactory만 있으면 Querydsl을 사용할 수 있다. extends/implements를 다 제거해도 된다.

- 동적 쿼리는 BooleanExpression

  

성능 개선 - Select

exist 메서드 금지

SQL.exist는 조건에 맞는 값을 찾으면 바로 종료, SQL.count는 조건에 맞는 값을 찾아도 모두 스캔

Querydsl의 exists는 실제로 count() > 0 으로 실행된다. => exists를 직접 구현해야 한다. => limit 1로 조회 제한

  

cross join 회피

묵시적 join으로 cross join 발생(Hibernate 이슈라서 Spring Data JPA도 동일하게 발생!) => 명시적 join으로 inner join 발생

  

Entity 보다는 Dto를 우선

- Entity 조회 시 Hibernate 캐시, 불필요한 컬럼 조회, OneToOne에서 N+1 쿼리가 터지는 등 단순 조회 기능에서 성능 이슈 요소가 많다.

- Entity 조회 => 실시간으로 Entity 변경이 필요한 경우

- Dto 조회 => 고강도 성능 개선 or 대량의 데이터 조회가 필요한 경우

조회 컬럼 최소화

select 컬럼에 Entity 자제

  

Group By 최적화

order by null을 직접 구현해서 적용한다.

  

커버링 인덱스

쿼리를 충족시키는데 필요한 모든 컬럼을 갖고 있는 인덱스

select/where/order by/group by 등에서 사용되는 모든 컬럼이 인덱스에 포함된 상태

NoOffset 방식과 더불어 페이징 조회 성능을 향상시키는 가장 보편적인 방법

JPQL은 from 절의 서브쿼리를 지원하지 않는다 => Querydsl에서도 지원하지 않는다.=> Cluster Key(PK)를 커버링 인덱스로 빠르게 조회하고, 조회된 key로 SELECT 컬럼들을 후속 조회한다.

  

성능 개선 - Update / Insert

일괄 update 최적화

무분별한 DirtyChecking을 확인해야 한다.

- DirtyChecking : 실시간 비즈니스 처리, 실시간 단건 처리 시

- Querydsl.update : 대량의 데이터를 일괄 Update 처리 시

  

JPA로 Bulk Insert는 자제한다

  

마무리

1. 상황에 따라 ORM / 전통적 Query 방식을 골라 사용할 것

2. JPA / Querydsl로 발생하는 쿼리 한번 더 확인하기