ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • [SQL] JOIN TUNING / NL JOIN
    Data miner/Development log 2023. 4. 3. 15:39
    728x90

        JOIN 은 SQL에서 가장 많이 활용되는 기본 명령어이다. 두 테이블을 공통값을 활용하여 병합하여 볼 수 있기 때문이다. 

    JOIN의 테이블 병합 방식에 따라 INNER / OUTER (LEFT, RIGHT, ALL) / CROSS / Self JOIN 4가지 종류로 나뉜다.

     

    - INNER JOIN (두 테이블의 교집합 / 공통값이 매칭되는 경우에만 조회)

    - LEFT JOIN (왼쪽 테이블 기준 데이터 조회)

    - RIGHT JOIN (오른쪽 테이블 기준 데이터 조회)

    - FULL JOIN (양쪽 테이블 기준 데이터 조회, LEFT/RIHGT JOIN의 성질을 모두 다 가지고 있음)

    - CROSS JOIN (두 테이블의 행을 결합하는 명령어, A의 n행과 B의 m행을 n*m으로 결합)

    - SELF JOIN (CROSS JOIN과 비슷한 방식이나, 결합대상이 자기 자신인 경우. 자기 자신의 행들의 결합을 보기 위한 명령어)

     

    JOIN 은 nested loop 라고 하는 인덱스를 활용한 NL 조인 방식이 기본 방식으로 작동한다. 이는 프로그래밍에서 사용하는 중첩된 반복문과 유사한 방식으로 조인을 수행한다. 선행 테이블의 조건을 만족하는 행을 추출하여 후행 테이블을 읽으면서 조인을 수행한다. 

     

    A, B 두 개의 테이블을 조건에 맞춰서 JOIN 하는 경우를 보자. A 테이블에 일정 조건 WHERE '구매일자' = '2023. 01. 01'와 같이 필터링 된 경우, A 인덱스(구매일자) 를 훑으면서 조건에 만족하는 ON이 걸려져 있는 키(ex. 고객코드)에 접근하여 B 테이블에 순차적으로 인덱스 키(ex. 고객코드) 를 사용하여 접근한다. 

     

    이 과정에서 A 인덱스(구매일자)를 훑으면서 조건에 만족하는 행을 한 줄씩 읽으면서 JOIN을 수행한다.  

    -- NL 조인 제어할 때 사용하는 힌트 use_nl
    
    SELECT /*+ ordered use_nl(t) */ c.고객코드, c.고객명, t.거래상품, t.거래상품코드
    FROM 고객 c, 거래내역 t
    WHERE c.구매일자 >= '2023.01.01'
    and c.고객코드 = t.고객코드

     

    기준이 되는 테이블인 고객 테이블을 Driving / Outer table이라고 하며, 나중에 엑세스 된 후행 테이블이 Driven table 이다. 성능을 향상시키기 위해서는 Driving 테이블 랜덤 엑세스 양이 적어지는 방식을 택해야 한다. 이를 위해서는 자연스레 선행테이블에 사용되는 인덱스 선택이 중요해진다. 인덱스 결과 행수가 최적으로 적어지도록 인덱스 선택해야 한다. 조인 컬럼에 대한 인덱스가 있는지 여부가 중요하고, 있을 경우 어떤 식으로 구성되어 있느냐에 따라서 조인 효율이 크게 달라지는 NL JOIN 방식이라고 할 수 있겠다. 

Designed by Tistory.