BETWEEN
을 조인조건절로 삼고 조회하는 목적BETWEEN만을 이용한 조인 조건 유도
SELECT
T1.카드사 AS CARD_ID
, V1.할부개월 AS MONTH
, NVL(T1.할부적용금액, 50000) AS BASE_AMT
FROM CARD.카드사_할부정보 T1
, (SELECT LEVEL AS 할부개월 FROM DUAL CONNECT BY LEVEL <= 36) V1
WHERE V1.할부개월 BETWEEN T1.할부시작월 AND T1.최대할부종료월
LEFT JOIN을 통한 조인 조건 강제 명시
SELECT
T1.카드사 AS CARD_ID
, V1.할부개월 AS MONTH
, NVL(T1.할부적용금액, 50000) AS BASE_AMT
FROM CARD.카드사_할부정보 T1
LEFT JOIN (SELECT LEVEL AS 할부개월 FROM DUAL CONNECT BY LEVEL <= 36) V1
ON V1.할부개월 BETWEEN T1.할부시작월 AND T1.최대할부종료월
실제 실행 시간
이유
V1.할부개월
1~36까지 생성T1의 모든 행 × V1의 36개 행
의 카타시안 조인(Cartesian Join)
을 먼저 수행한 후 BEWTWEEN
필터링으로 동작NESTED LOOPS
조인이 수행 되고, T1의 모든 행 × V1의 36개 행
비교가 이루어졌음 결론
🚨 옵티마이저가 WHERE
조건절의 BETWEEN
필터링으로 인식
🚨 데이터 산출을 위해 NESTED LOOPS
방식으로 동작하고 BETWEEN FILTER
가 추가로 적용
실제 실행 시간
이유
옵티마이저에게 명확한 조인 조건을 명시하여 NESTED LOOPS
→ HASH JOIN
사용 유도
V1
의 할부개월 36개 행에 대한 조인 조건절로 T1
테이블 매칭
V1
과 T1
를 먼저 결합한 후 BETWEEN 필터링을 적용T1.시작할부개월
~ T1.최대할부종료월
범위에 있는 V1.할부개월 값
만 비교V1 × T1
모든 데이터 비교옵티마이저 조인 조건 최적화
INDEX RANGE SCAN
적용✅ 조인 조건의 유도가 아닌 명확한 명시는 필수
✅ 비교 대상의 데이터가 많으면 많을수록 JOIN
자체를 어떻게 구성할지 고민 필요
✅ 다수 조인은 옵티마이저의 실행 계획 최적화를 위해 기준 테이블을 잡아주는 LEFT JOIN
을 사용
✅ 조회 조건의 경우 반드시 INDEX
를 탈 수 있도록 구성
INDEX RANGE SCAN
유도✅ 데이터 필터링이 가능한 경우, 먼저 필터링을 적용한 후 조인을 수행(절대적 연산 데이터 감소)