ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • [우아콘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

    댓글

Designed by Tistory.