문제 링크 : https://velog.io/@yooha9621/SQLP실기문제51번
🍎 부분은 내가 생각했을때 튜닝하면서 봐야할 핵심부분을 체크한 곳이다.
1. 주문상품_X1 인덱스 스캔
2. 1단계의 10만건을 상품 테이블과 NL조인
3. 2단계의 10만건을 grouping
4. 3단계의 데이터 Sort
5. 4단계의 데이터 부분범위처리(상위 100개)
[인덱스 추가]
상품_X1 :등록일시
[인덱스 재구성]
주문상품_X1 :할인유형코드 + 주문일시
SELECT /*+ LEADING(P) USE_NL(O) INDEX_DESC(P 상품_X1)*/
P.상품코드 , P.상품명 , P.상품가격 , O.총주문수량 , O.총주문금액
FROM ( SELECT /*+ INDEX(A 주문상품_X1) NO_MERGE PUSH_PRED*/ 상품코드 ,SUM(O.주문수량) 총주문수량 , SUM(O.주문금액) 총주문금액
FROM 주문상품 A
WHERE 주문일시 >= ADD_MONTHS(SYSDATE,-1)
AND 할인유형코드 = 'K890'
GROUP BY 상품코드 ) O , 상품 P
WHERE O.상품코드 = P.상품코드
ORDER BY P.등록일시 DESC
🍎 정리
- 상품의 등록일시를 기준으로 상위 100건 추출이므로 '등록일시'가 선두컬럼인 인덱스를 가진 상품 테이블을 드라이빙 테이블로 놓고 '상품코드'로 주문 상품 테이블과 NL조인을 처리하도록 만든다.
😥 헷갈렸던 부분
- 상품에서 주문 상품으로 NL 조인을 시도하는 횟수는 최소 100번 최대 50만인데...
- NL조인 시도 횟수가 덜 할 것이라고 보장하는 부분이 어디인지 모르겠다.
- 왜냐하면 할인유형코드 'k890'을 만족하는 데이터가 전체의 10%이기 때문이다..
- 아무리 대부분의 상품을 주문했더라도 1/10 확률로 할인유형코드가 'k890'이기 때문에 조인시도 실패 확률이 크다.
- 그렇다면 여기서 궁금한 점! NL조인의 부하의 시작점이 어디인걸까? 조인을 시도하는 부분인걸까 조인을 직접 하는 부분인걸까?
- 우선 조인시도에 대한 부하까지는 생각하지 않는 게 좋은 것 같다.