Working

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

개구리는 개꿀개꿀 2021. 3. 8. 14:13

www.youtube.com/watch?v=zMAX7g6rO_Y

1. 워밍업

- extends, implements 사용하지 않기

  -> 대신 QueryDslRepositorySupport 상속, JPAQueryFactory 빈 등록

  -> JpaQueryFactory만 있으면 QueryDsl은 사용할 수 있다!

- 동적 쿼리

  -> 어떤 쿼리인지 예상하기 어렵다

  -> BooleanExpression - null 반환시 자동으로 조건에서 제거된다.

 

2. 성능개선 - SELECT

- querydsl exist 금지

- exist는 조건에 부합하는 row 1개만 찾으면 바로 쿼리 종료 하지만 count는 끝까지 찾는다

- querydsl의 exist는 내부적으로 count를 사용

- 실제로 구현해보자! - limit 1

 

 

- Cross Join 회피

  - where문에 따라 묵시적 조인 발생

  - Hibernate 이슈라서 spring data jpa도 동일하게 발생

  - 명시적 조인으로 사용

 

- Entity 보다는 Dto를 우선

  - Entity 조회시 hibernate 캐시, 불필요 컬럼 조회, oneToOne N+1 문제 발생

  - 고강도 성능 개선 or 대량의 데이터 조회시 Dto 조회가 더 좋음

  - as 표현식으로 컬럼 조회 제외

 

- Group By 최적화

  - mysql 에서 groupby를 실행하면 index를 못탔을 때 file sort가 필수로 발생

  - order by null을 사용하면 file sort가 제거된다.

  - querydsl은 order by null 문법을 지원하지 않음. -> 직접 구현(Paging 사용 불가)

 

- 커버링 인덱스

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

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

  - JPQL은 from 절의 서브쿼리를 지원하지 않음.

  - 우회 : PK를 커버링 인덱스로 조회하고, 조회된 키로 select column을 후속 조회 한다.

 

3. 성능개선 - Update/Insert

 

- 일괄 Update 최적화

  - 무분별한 DirtChecking을 사용하지 말자

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

  - Querydsl.update - 대량 데이터 일괄 update

 

 

4. Bulk Insert

- jdbc rewriteBatchedStatements(Insert 합치기) -> jpa의 auto_increment 일때는 적용되지 않는다.

- querydsl 의 구현체 querydsl-JPA

- querydsl 의 다른 구현채 querydsl-SQL - 적용하기 매우 번거로움

- jpa 어노테이션으로 QClass 생성? entityQL project 사용