-
[우아콘2020] 수십억건에서 QUERYDSL 사용하기Working 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 사용
'Working' 카테고리의 다른 글
Apache HttpClient5 (0) 2021.07.20 Armeria, gRPC, Zipkin, ELK 조합 굿 (0) 2021.07.15 Mapstruct (0) 2021.02.22 Best practices for REST API design (0) 2021.02.22