문제 링크 : https://velog.io/@yooha9621/SQLP실기문제52번
🍎 부분은 내가 생각했을때 튜닝하면서 봐야할 핵심부분을 체크한 곳이다.
1. 주문상품 해당 월 파티션 액세스
2. 주문상품_X1 로컬 파티션 인덱스 스캔
2. 1단계의 10만건을 상품 테이블과 NL조인
3. 2단계의 20만건을 grouping
4. 3단계의 5천건 Sort
5. 4단계의 5천건 중 상위 100개만 추출
[인덱스 재구성]
주문상품_X1 : 할인유형코드 + 주문일시
[인덱스 추가]
상품_X1 : 등록일시 + 상품코드
SELECT /*+ LEADING(O) USE_NL(O) NO_NLG_BATCHING(P)*/
P.상품코드 , P.상품명 , P.상품가격 , O.총주문수량 , O.총주문금액
FROM ( SELECT /*+ FULL(A) INDEX_FFS(B) LEADING(B) USE_HASH(A) */ 상품코드 ,SUM(O.주문수량) 총주문수량 , SUM(O.주문금액) 총주문금액 , MIN(B.등록일시) 등록일시
FROM 주문상품 A , 상품 B
WHERE A.주문일시 >= ADD_MONTHS(SYSDATE,-1)
AND A.할인유형코드 = 'K890'
AND B.상품코드 = A.상품코드
GROUP BY A.상품코드
ORDER BY 등록일시 DESC) O , 상품 P
WHERE ROWNUM <= 100
AND O.상품코드 = P.상품코드
🍎 정리
- 부분 범위 처리 문제처럼 보이지만 우선은 아니다.
- 50만건 상품중에 5000건만 조인이 되는데 이를 등록일시순으로 정렬한 뒤 5000건을 찾을때까지 NL조인을 시도하는 건 부하가 자칫하면 커질 수도 있기 때문이다.
- 따라서 순서는 다음과 같다.
- 상품 인덱스 (등록일시 + 상품코드)를 fast full scan 하여 해시맵으로 깔고
- 할인유형코드 (10%)를 적용한 주문상품 데이터로 하여금 해시조인을 실행 + 그룹화
- 5000건으로 만든 뒤 소팅하고 100건을 추출해내어 다시 상품과 조인하도록 한다.
- 드라이빙(바깥) 테이블의 로우술를 줄이기 위한 노력은 NL조인에서 하는것!해시조인은 그런 걱정을 할 필요가 없다.