본문 바로가기
728x90

Spring19

[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.
[Spring] Querydsl Join 성능 개선 Querydsl exists 성능 개선에 이어서 Querydsl Join에 대한 글을 정리해보려고 한다. 일단 Cross Join에 대해서 간단하게 정리해보자 Cross Join은 상호 조인이라 불리며, 한 테이블의 모든 컬럼들과 다른 테이블의 모든 컬럼들을 조인되는 기능이며 성능상 잘 나오지 않는다. 두 테이블의 나올 수 있는 모든 경우의 수를 대상으로 하기 때문에 성능이 좋을 수 없다. 그래서 Cross Join은 피하는 게 좋다. 왜 Cross Join을 이야기하는가? 오늘 성능 개선에 대한 내용의 주인공이다. 테스트용 @OneToOne 세팅 Member Entity public class Member { @Id @GeneratedValue(strategy = GenerationType.IDENTI.. 2022. 11. 21.
300x250