문제 링크 : https://velog.io/@yooha9621/SQLP실기문제-소트튜닝12번
1. 상품_X1(상품유형코드) 인덱스 통해 액세스
2. 1단계의 100건을 계약_X2(상품번호) 인덱스 통해 NL 조인
3. 2단계의 100건 중복 제거 Sort
-상품 테이블과 '상품번호'로 세미 조인(또는 EXIST문)하면서 동시에 계약기간도 비교해야하므로 인덱스를 상품번호 + 계약 기간으로 재구성한다.
[인덱스 재구성]
계약_X2 : 상품번호 + 계약기간
-- NL_SJ 조인시
SELECT /*+ LEADING(P) */
P. 상품번호, P. 상품명, P.상품가격, P.상품분류코드
FROM 상품 P
WHERE
P.상품유형코드 = :PCLSCD
AND EXISTS ( SELECT /*+ UNNEST NL_SJ */ 'X'
FROM 계약 C
WHERE C.상품번호 = P.상품번호
AND C.계약일자 >= TRUNC(ADD_MONTHS(SYSDATE, -12))
);
-- 조인시도 안하고 EXSISTS 문으로 실행시
SELECT /*+ LEADING(P) */
P. 상품번호, P. 상품명, P.상품가격, P.상품분류코드
FROM 상품 P
WHERE
P.상품유형코드 = :PCLSCD
AND EXISTS ( SELECT /*+ NO_UNNEST */ 'X'
FROM 계약 C
WHERE C.상품번호 = P.상품번호
AND C.계약일자 >= TRUNC(ADD_MONTHS(SYSDATE, -12))
);
🍎 정리
- 중복 소트를 없애기 위해 상품 테이블을 드라이빙 테이블로 두고 계약 테이블을 100건만 찌를 수 있도록 계약 테이블에 존재 여부만 조회하도록 바꾼다.
✅ 조심할 부분
- 해시 조인을 쓰는 목적을 제대로 알고 쓸 줄 알아야한다.
- ⭐️ 즉 , NL조인을 하기엔 액세스 량이 너무 많은 경우 !! 그 대안으로 해시 조인을 쓰도록 하자!!