포스트

Lateral 조인을 통한 개선 사례 두번째

문제

문제 없는데 … 아냐 좀 느렸어 비효율이였어

원인

첫번째 사례와는 다르다 첫번째 사례와는!

 SELECT 결과 
   FROM 파티션테이블 A 
      , 일반테이블 B    
  WHERE A.ID = B.ID 
    AND A.일자 BETWEEN :날짜시작 AND :날짜끝

파티션테이블 A의 인덱스는 (일자,ID,기타등등 겁나길어) 컬럼으로 구성된 PK인덱스 한개 뿐이다
그래서 HASH JOIN되고 있는 상황

하지만, 실제 데이터 구성을 보면 USE_NL로 적용되는게 훨씬 탐색량이 적은 상황
그럼 힌트를 넣으면 될까?

해결

아니다, 이 쿼리는 박제되어 Copy&Paste 될 운명이다
힌트로 강제하기 보다는 자연스럽게 쿼리로 옵티마이저의 해석을 유도하기 위해
쿼리를 변경했다

 SELECT 결과 
   FROM 파티션테이블 A 
      , 일반테이블 B 
      , LATERAL
         (
           SELECT :날짜시작 + (LEVEL-1) AS 일자
             FROM DUAL
            WHERE B.ID IS NOT NULL 
           CONNECT BY LEVEL <= :날짜끝 - :날짜시작 + 1
         ) S
  WHERE A.ID = B.ID 
    AND A.일자 = S.일자 
    AND A.일자 BETWEEN :날짜시작 AND :날짜끝

로 작성하자 예상대로 일반테이블 B는 더미 일자테이블 S 와 머지조인카테시안을 먼저하고
파티션테이블과 NL조인했다

LATERAL을 하지 않고 그냥 머지 조인할 땐 조인 순서가 뒤바뀌어서
영 좋지 못한 자세가 나왔었다
(하지만, 뻘짓 같다)

이 기사는 저작권자의 CC BY 4.0 라이센스를 따릅니다.