LostCatBox

1:N 관계 간의 중복 데이터 쿼리 성능 개선

Word count: 220Reading time: 1 min
2024/02/11 Share

왜?

  • 팝업 테이블에는 1:N 관계로 이용권, 장치, 이미지 등이 존재하였다.

  • 요구사항

    • 매번 팝업을 등록 시 기존에 중복되는 팝업 valid

      (이용권+기간+장치를 체크, 중복되는 팝업이 없는지 체크)

    • poc / 이용권 / 기간 하나라도 겹치는것이 있다면 노출 불가

      • 전체(all) 등록시 -> [전체(all), 유료(paid) 이용권별, 무료(free)] 노출기간 중복 체크
      • 무료(free) 등록시 -> [전체(all), 무료(free)] 노출기간 중복 체크
      • 유로(paid) 등록시 -> [전체(all), 유료(paid) 이용권별] 노출기간 중복 체크

문제: 현 table조건에서는 start_dt, end_dt 풀스캔 요구됨.

기존 코드의 문제점

  • 3개의 테이블을 한번에 조회
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
public Page<PopupQueryDto> findPopups(PageRequest pageRequest, PopupFindRequest request, String regionCd) {

...

List<PopupQueryDto> results = groupBy(popup.id).list(
new QPopupQueryDto(
popup.seqCd,
popup.popupCd,
popup.popupNm,
popup.memberType,
GroupBy.set(popupPackage),
popup.startDt,
popup.endDt,
GroupBy.set(popupPoc),
popup.insId,
popup.insDt,
popup.updId,
popup.updDt,
popup.isView
))
.transform(
this.queryFactory
.from(popup)
.leftJoin(popupPoc).on(popupPoc.popup.id.eq(popup.id))
.leftJoin(popupPackage).on(popupPackage.popup.id.eq(popup.id))
.where(
popup.isDel.eq(false),
eqRegionCd(regionCd),
...

results = filterPopupsWithPoc(request, results);
long totalCount = results.size();

int start = (int) pageRequest.getOffset();
int end = (start + pageRequest.getPageSize()) > results.size() ? results.size() : (start + pageRequest.getPageSize());

return start < totalCount ? new PageImpl<>(results.subList(start, end), pageRequest, totalCount) : new PageImpl<>(List.of(), pageRequest, totalCount);
}
CATALOG
  1. 1. 왜?
  2. 2. 기존 코드의 문제점