문제 링크 : https://velog.io/@yooha9621/47번
🍎 부분은 내가 생각했을때 튜닝하면서 봐야할 핵심부분을 체크한 곳이다.
1) 데이터 정리
1.주문 상품 테이블
- 🍎비파티션🍎 테이블
- 한 달 주문상품 = 100만건
- 주문상품 총 건수 = 총 1억 2천만 건 (=100만 X 120개월)
- 할인유형코드 조건을 만족하는 데이터 비중 = 🍎20%🍎
2.상품 테이블
- 등록된 상품 = 2만개
- 🍎2만 개 상품을 고르게 주문🍎
2) 기존 쿼리 분석
1. 주문상품_X1 인덱스 스캔
- 한 달 동안 주문된
- 할인 유형 코드가 'k890'인
2. 1단계의 20만건을 상품 테이블과 NL조인
3. 2단계의 20만건을 grouping
- 2만 개 상품을 고르게 주문했으므로 그룹핑하면 약 2만건 추출
4. 3단계의 2만건 Sort
3) 🍎쿼리 튜닝🍎
1.주문 상품 테이블 액세스
- 1억 2천만건의 비파티션 테이블에서 20만건을 뽑아내므로 인덱스 사용
- 조건절은 1) 할인유형코드 = 조건 , 2) 기간 범위 조건 2가지가 있으므로
조건절이 '액세스 -> 액세스' 로 처리되게 만든다.
- 기존(주문상품_X1)에는 '기간 + 할인 유형 코드'로 구성되어 '기간' 액세스 -> '할인유형코드' 스캔 방식으로 조건절이 처리됨
- 따라서 주문상품_X1을 '할인유형코드 + 주문일시' 로 수정한다.
2.상품 테이블 액세스
- 등록된 상품 = 2만개이고 2만 개 상품을 고르게 주문하므로 상품 테이블의 약 대개의 데이터가 액세스될 것이다.
- 따라서 상품 테이블을 Full 스캔할 수 있도록 유도한다.
- Full 스캔하면 따라오는 건 뭐다? 해시 조인인 거시다~~!
3.주문상품 - 상품 테이블 조인 방식
- ⭐️ 우선 20만건의 NL조인을 다른 방법의 조인으로 바꿔야한다. ⭐️
- 주문 상품 테이블 따로 그룹핑을 하여 조인 대상 로우수를 2만건으로 줄인다.
4) 튜닝한 SQL문
[인덱스 재구성]
주문상품_X1 : 할인유형코드 + 주문일시
SELECT
P.상품코드 , P.상품명 , P.상품가격 , O.총주문수량 , O.총주문금액
FROM ( SELECT 상품코드 ,SUM(O.주문수량) 총주문수량 , SUM(O.주문금액) 총주문금액
FROM 주문상품 A
WHERE 주문일시 >= ADD_MONTHS(SYSDATE,-1)
AND 할인유형코드 = 'K890'
GROUP BY 상품코드 ) O , 상품 P
WHERE O.상품코드 = P.상품코드
ORDER BY 총 주문금액 DESC , 상품코드
😥 헷갈렸던 부분
- 🍎push_pred는 쓰지 않는다!
- 왜냐하면 상품(P) 테이블을 먼저 리딩해서 해시맵에 깔아놓고 그 후에 그룹핑한 주문상품 2만건을 하나씩 해시조인 하는 방식으로 풀어냈기 때문이다.