메모 목적의 글로써 생략되는 내용이 많이 있을 수 있는점을 감안해주세요
(우아콘 2020참고)
- querydsl exist 사용 금지
- 기본
- sql의 exist는 조건을 만족하는 1번째 row를 만나면 쿼리가 바로 종료
- count의 경우는 모든 row를 scan해야하기 때문에 성능이 exist보다 안 좋음
- qeurydsl의 exist는 count 쿼리를 이용해서 수행되기 때문에 성능이 안 좋음
- 직접 구현
- limit 1을 추가함(예전에 mysql 생쿼리로 개발할때도 이렇게 했었음..)
- 다만, 조회결과가 없으면 0이 아니라 null을 반환하니 null 체크처리 주의
- limit 1을 추가함(예전에 mysql 생쿼리로 개발할때도 이렇게 했었음..)
- 기본
- cross join 회피
- 나올수 있는 모든 경우의 수를 대상으로 하기때문에 성능이 안좋은 cross join. 피하는게 좋음
- querydsl은 묵시적 join사용할때 cross join발생할 수 있음
- 명시적 join으로 회피
- 예) innerJoin 메소드로 명시적 처리
- Entity 보다는 DTO를 우선 사용
- entity 조회시
- 실시간으로 Entity 변경이 필요한 경우에는 장점 -> 다만 회사 프로덕션 환경에서 이럴일은 없음
- hibernate 캐시 불필요
- 불필요한 컬럼 조회
- OneToOne N+1 쿼리 등
- 단순 조회 기능에서는 성능 이슈 요소가 많음
- DTO 조회시
- 고강도 성능 개선, 대량의 데이터 조회가 필요한 경우
- 조회 컬럼 최소화하기
- as 표현식으로 대체하면 DB에실행되는쿼리에서 as컬럼은 제외됨
- 예) Expressions.asNumber(bookNo).as("bookNo")
- as 표현식으로 대체하면 DB에실행되는쿼리에서 as컬럼은 제외됨
- Select 컬럼에 Entity 자제
- 불필요 신규 Entity의 모든 컬럼이 조회될 수 있음
- OntToOne 관계에 대해서 매건마다 조회됨(N+1무조건 발생하게 됨)
- entity 조회시
- Group by 최적화
- mysql에서는 order by null 을 이용하면 file sort가 발생하지 않는 기능이 존재(개인적으로도 많이 사용)
- querydsl에서는 order by null을 지원하지 않기 때문에 직접 구현해서 사용
- 정렬이 필요하더라도 조회결과가 100건 이하라면 어플리케이션에서 정렬하는걸 고려(페이징이 아닐때만)
- was는 scale out이 가능하지만 DB는 어려움
- 정렬이 필요하더라도 조회결과가 100건 이하라면 어플리케이션에서 정렬하는걸 고려(페이징이 아닐때만)
- 커버링 인덱스 사용
- 개인적으로도 대용량 게시판 서비스의 페이징 개념 만들때 사용함
- jpql은 from절의 서브쿼리를 지원하지 않기 때문에 우회처리가 필요
- 쿼리를 2개로 나눠서 실행
- Cluster Key(PK와 같은)를 커버링 인덱스로 빠르게 조회하고
- 조회된 Key로 select쿼리를 in 쿼리로 실행
- 쿼리를 2개로 나눠서 실행
- update 최적화
- 무분별한 DirtyChecking을 꼭 확인해야함
- 실시간 비지니스 처리, 실시간 단건 처리시
- 하이버네이트 캐시는 일괄 업데이트시 캐시 갱신이 안되기때문에
- Querydsl.update
- 대량의 데이터를 일괄로 Update 처리시
- 실시간 비지니스 처리, 실시간 단건 처리시
- 무분별한 DirtyChecking을 꼭 확인해야함
- bulk insert
- JPA에서는 auto_increment일때는 insert합치기가 적용되지 않는 문제가 있음
- jdbcTemplate롤 bulk insert는 처리 가능하나, 컴파일 체크, Type-safe 개발이 어려움
- 문자열로 쿼리를 작성해야해서
- 따로 개발해서 진행할수도 있지만... 개인적으로 고민좀 되는 부분이 있음
'JAVA > Java 일반' 카테고리의 다른 글
CSV파일 파싱 샘플(with apache commons-csv) (0) | 2021.11.12 |
---|---|
java 2글자국가코드_및_국가명_리스트조회 프로그램 (0) | 2021.08.05 |
java stream filter를 이용한 중복 제거 방법(샘플) (0) | 2021.04.06 |
java 사설인증키 처리 - 1 (0) | 2021.03.31 |
금칙어 처리(with Aho corasick 알고리즘) (1) | 2020.11.12 |