추가 검증 보류: 이 항목은 원문에서도 실측 비교가 미완료된 상태입니다. SQL은 검토용 예제로 참고합니다.
검토 상태: 추가 테스트 필요 (보류)
•
후속 검증: 일반 테이블 startdbpg.tr_ord에서 NOT EXISTS·ROW_NUMBER()·GROUP BY + MAX를 업무 조건별로 추가 비교한다. 회원별/매장별, 날짜 범위, Hash Anti Join·Merge Anti Join·Nested Loop Anti Join 선택에 따른 성능 차이를 확인한다.
•
현재까지 관찰: 매장별 주간 조회에서는 NOT EXISTS가 경쟁력 있었으나, 회원별 조회와 단일 매장 장기간 조회에서는 ROW_NUMBER()가 유리했다. 새로 만든 tr_ord_x55(shop_id, ord_dtm, ord_no)가 실제 계획에 쓰이는지 및 쓰기 비용 대비 실효성도 검토해야 한다.
•
주의: 아래 tr_ord_big의 기존 BAD/GOOD은 미확정 초안으로 유지한다. ROW_NUMBER()가 항상 빠르다는 의미는 아니며, NOT EXISTS로 대체할지는 추가 테스트 후 결정한다.
상황: 09-04와 같은 날짜의 회원별 최대 주문번호 한 건이 필요하다.
BAD SQL — 기존 또는 비교 대상
SELECT o.mbr_id, o.ord_no, o.ord_dtm, o.ord_amt
FROM tr_ord_big AS o
WHERE o.ord_no = (
SELECT MAX(x.ord_no)
FROM tr_ord_big AS x
WHERE x.mbr_id = o.mbr_id
AND x.ord_dtm >= TIMESTAMP '2023-01-05'
AND x.ord_dtm < TIMESTAMP '2023-01-06'
);
SQL
복사
GOOD SQL — 권장 또는 대안
SELECT r.mbr_id, r.ord_no, r.ord_dtm, r.ord_amt
FROM (
SELECT o.mbr_id, o.ord_no, o.ord_dtm, o.ord_amt,
ROW_NUMBER() OVER (
PARTITION BY o.mbr_id
ORDER BY o.ord_no DESC
) AS rn
FROM tr_ord_big AS o
WHERE o.ord_dtm >= TIMESTAMP '2023-01-05'
AND o.ord_dtm < TIMESTAMP '2023-01-06'
) AS r
WHERE r.rn = 1;
SQL
복사
핵심
•
날짜 조건을 먼저 적용한 후 PARTITION BY mbr_id로 묶고, 회원별 ord_no DESC 첫 행을 선택한다.
참고·예외
•
ROW_NUMBER는 SQL상 회원별 한 건을 만드는 방법일 뿐, 적합한 정렬 인덱스가 없다면 많은 후보 행의 Sort가 발생할 수 있다. MAX+선집계 방식과 성능 비교가 필요하다. 반환 그룹에 여러 건을 허용한다면 RANK/동률 처리 등 다른 요구사항이다.



