[SQLP실기풀이]6장 고급SQL튜닝(1)-소트튜닝13번

Yu River·2022년 7월 2일
0

SQLP실기연습

목록 보기
39/44

문제 링크 : https://velog.io/@yooha9621/SQLP실기문제-소트튜닝13번

1) 데이터 정리

1.상품 테이블

  • 상품 총 건수 = 총 100개

2.주문 테이블

  • 1달 주문건수 = 100만건
  • 12달 주문건수 = 1200만건(총건수 대비 약 10% 넘음)
  • 총 건수 = 총 1억 건 (=100만 X 100개월)
  • 거의 모든 상품에 골고루 주문 발생

3.주문상품 테이블

  • 총 건수 = 총 2억 건
  • ⭐️ 1개의 상품코드당 약 200만개
  • 1개의 주문당 약 2개의 주문상품

2) 기존 쿼리 분석

1. 주문_X1(주문일자) 인덱스 통해 1년치 주문 액세스(1200만건)
2. 1단계의 1200만건을 주문상품_PK(주문번호 + 상품코드) 인덱스 통해 NL 조인

  • 거의 모든 상품에 골고루 주문이 발생하므로 상품코드 조건에 걸러지는 데이터가 거의 없을듯

3. 2단계 결과집합 중복 제거 Sort

⭐️ 답안 튜닝 포인트

  1. 주문 상품에 NL_SJ 조인을 하거나 EXISTS문을 통해 접근하면 최소 1200만건 이상을 수행해야하므로 옳지 않다.따라서 해시 조인으로 실행하도록한다.
  2. 먼저 스캔할 테이블을 정한다.(해시 맵 Build Input)
    • 상품코드 '=' 조건을 만족하는 주문상품 테이블의 데이터는 약 200만건이다.
    • 주문 상품은 '상품코드'와 '주문일자'로만 검색하므로 주문상품_PK를 Index fast full 스캔하여 build 인풋으로 놓는다.
  3. 주문 테이블은 1억건중 1200만건이므로 풀스캔으로 처리한다.

3) 튜닝한 SQL문


SELECT /*+ LEADING(P) INDEX_FFS(P 주문상품_PK) USE_HASH(O) FULL(O) */
0. 주문번호, 0.주문금액, 0.결제구분코드, 0.주문매체코드
FROM 주문 0, 주문상품 P
WHERE 0.주문일자 >= TRUNC(ADD_MONTHS(SYSDATE, -12))
AND P.주문번호 = 0.주문번호
AND P.상품코드 = :PRD_CD

✅ 조심할 부분

  • 해시 조인을 쓰는 목적을 제대로 알고 쓸 줄 알아야한다.
  • ⭐️ 즉 , NL조인을 하기엔 액세스 량이 너무 많은 경우 !! 그 대안으로 해시 조인을 쓰도록 하자!!
  • 주문 테이블은 1억건중 1200만건이므로 풀스캔으로 처리한다.
profile
도광양회(韜光養晦) ‘빛을 감추고 어둠속에서 힘을 기른다’

0개의 댓글