문제 링크 : https://velog.io/@yooha9621/SQLP실기문제50번
🍎 부분은 내가 생각했을때 튜닝하면서 봐야할 핵심부분을 체크한 곳이다.
1. 주문상품 해당 월 파티션 액세스
2. 주문상품_X1 로컬 파티션 인덱스 스캔
3. 2단계의 20만건을 상품 테이블과 NL조인
4. 3단계의 20만건을 grouping
5. 4단계의 2만건 Sort
6. 🍎5단계의 2만건 중 100건 부분 범위 처리🍎
SELECT /*+ LEADING(O) USE_NL(P) NO_NLG_BATCHING(P)*/
P.상품코드 , P.상품명 , P.상품가격 , O.총주문수량 , O.총주문금액
FROM ( SELECT /*+ FULL(A) NO_MERGE */ 상품코드 ,SUM(O.주문수량) 총주문수량 , SUM(O.주문금액) 총주문금액
FROM 주문상품 A
WHERE 주문일시 >= ADD_MONTHS(SYSDATE,-1)
AND 할인유형코드 = 'K890'
GROUP BY 상품코드
ORDER BY 총 주문금액 DESC , 상품코드) O , 상품 P
WHERE O.상품코드 = P.상품코드
AND ROWNUM <=100
또는 (NO_NLG_BATCHING 힌트를 사용하지 않는 경우 order by를 한 번 더 수행)
SELECT /*+ LEADING(O) USE_NL(P)*/
P.상품코드 , P.상품명 , P.상품가격 , O.총주문수량 , O.총주문금액
FROM ( SELECT /*+ FULL(A) NO_MERGE */ 상품코드 ,SUM(O.주문수량) 총주문수량 , SUM(O.주문금액) 총주문금액
FROM 주문상품 A
WHERE 주문일시 >= ADD_MONTHS(SYSDATE,-1)
AND 할인유형코드 = 'K890'
GROUP BY 상품코드
ORDER BY 총 주문금액 DESC , 상품코드) O , 상품 P
WHERE O.상품코드 = P.상품코드
AND ROWNUM <=100
ORDER BY 총 주문금액 DESC , 상품코드
🍎 정리
- 주문 상품을 Full스캔한 뒤 그룹핑하여 로우수를 줄이고
줄인 로우수 100건으로 상품 테이블과 NL조인을 한다.
✅
NO_NLG_BATCHING(테이블명)
힌트 사용하기
- 조인과정 중에 인라인 뷰 안에서 정렬된 결과가 뒤섞이지 않도록 한다.
- 테이블명안에는 조인을 시도할 테이블명이 들어간다.