본문 바로가기
728x90

queryDSL8

[Spring] Querydsl Bulk Update 성능 개선 일괄 업데이트 최적화에 대해 방식에 대해서 글을 정리해보고자 한다. JPA 사용하다 보면 더티 체킹(Dirty Checking)을 많이 사용하게 된다. 더티 체킹에 대해서 궁금하면 이 전 포스팅 글을 한번 읽어보는 것을 추천한다. 간단하게 설명하자면 조회된 엔티티의 변경 사항을 자동으로 데이터베이스에 반영해주는 기능이다. 1000건 ~ 10000 건등의 대량의 엔티티의 변경을 해야 한다면 해당 엔티티들을 조회해서 엔티티의 값을 변경하는 방식으로 개발이 될 것이다. 이러한 방식은 성능을 저하시키는 악영향을 끼치게 된다. 테스트 코드와 성능을 비교해보자. license 1000건의 엔티티를 조회해서 name을 업데이트하는 방식으로 테스트 진행해보자. 1. Dirty Checking 방식 @Transactio.. 2022. 11. 26.
[Spring] Querydsl 서브 쿼리 적용하기 JPQL은 FROM절의 서브 쿼리를 지원하지 않는다. JPQL에서 지원하지 않는다는 것은 Querydsl도 동일하게 지원하지 않는다는 것이다. 그래서 서브 쿼리를 충족시키기 위해 Querydsl에 우회 코드를 만들어보자. SELECT * FROM shop s join (SELECT id FROM shop where id < 100 ORDER BY id LIMIT 10, 10) as tmp on tmp.id = s.id 위의 서브 쿼리 조건을 아래와 같이 Querydsl에 적용하였다. Cluster Key(PK)를 커버링 인덱스로 빠르게 조회한 PK 값들을 Where 절에 적용하여 별도로 필요한 SELECT 칼럼들을 추가 조회하였다. 즉, 위의 쿼리에서는 where, orderBy, limit 절 까지는 .. 2022. 11. 24.
[Spring] Querydsl Group By 성능 개선 기본적으로 Mysql에서 Group By를 실행하면 실행 계획 Extra 컬럼에 Using temporary 또는 Using filesort가 발생된다. Using Temporary (임시 테이블) Group By 할때 Mysql 엔진이 스토리지 엔진으로부터 받아온 레코드를 내부적으로 임시 테이블을 생성해서 사용한다. 메모리로 테이블을 생성했다가 테이블의 크기가 커지면 디스크로 옮겨지는 특성이 있기 때문에 디스크에 생성되면 이때 성능 이슈가 발생된다. Using filesort (드라이빙 정렬) 요구하는 조건이 인덱스를 통해 정렬을 할 수 없다면 FileSort를 사용하게 된다. 임시 테이블의 정렬도 FileSort에 해당된다. 그러므로 FileSort는 레코드가 많아질수록 성능이 많이 떨어지게 된다. .. 2022. 11. 23.
[Spring] Querydsl Select 성능 개선 1. 테스트 테이블 관계 생성 @Entity public class Shop { @Id @GeneratedValue(strategy = GenerationType.IDENTITY) private Long id; private Long shopNo; private String name; @OneToOne(mappedBy = "shop") private License license; } @Entity public class License { @Id @GeneratedValue(strategy = GenerationType.IDENTITY) private Long id; private Long licenseNo; private String name; @OneToOne @JoinColumn(name = "sho.. 2022. 11. 22.
300x250