https://www.youtube.com/watch?v=zMAX7g6rO_Y&t=3s
SELECT
UPDATE / INSERT
Querydsl에서 exist 사용 금지
Cross Join 회피하라
.where(customer.customNo.gt(shop.shopNo))
명시적 join 사용
.innerJoin(customer.shop, shop)
.where(customer.customNo.gt(shop.shopNo))
Entity 보다 Dto를 우선하라
조회 컬럼 최소화
public List<BookPageDto> getBooks(int bookNo, int pageNo){
return queryFactory
.select(Projections.fields(BookPageDto.class,
book.name,
Expression.asNumber(bookNo).as("bookNo"),
book.id))
.from(book) ...
}
엔티티에 다른 엔티티가 연관되어있다면, 해당 엔티티의 모든 컬럼이 다 조회되어버림
oneToOne은 LazyLoading이 안된다 > N+1 문제
또한 distinct 대상이 entity 컬럼 전체가 되어 최적화에 악영향을 끼친다
엔티티 연관관계를 맺기 위해서 반대 엔티티도 필요하지 않은가?


Group By 최적화
ORDER BY NULL : 특정 컬럼의 정렬을 NULL 값으로 강제로 설정하는 방법커버링 인덱스
select *
from academy a
join (select id
from academy
order by id
limit 10000, 10) as temp
on temp.id = a.id
그러나 JPQL에서는 from 절에 서브쿼리를 지원하지 않는다
대안

DirtyChecking vs Querydsl.update
모든 컬럼을 돌면서 update해야 하는 dirty checking
한번에 update by querydsl의 성능!!
queryFactory.update(student).where(student.id.loe(studentId))
.set(student.name, name)
.execute(); // 벌크 연산시 사용
단점으로 일괄 업데이트시에 하이버네이트 캐시 갱신이 안됨
Querydsl