본문 바로가기

SQL 문 STUDY

SQL - 중첩 루프 조인/ SORT MERGE / HASH JOIN

   

중첩 루프 조인

 

    ● 먼저 수행되는 집합(선행 테이블)의 처리 범위가 전체 일량을 좌우함
    ● 먼저 수행되는 집합이 상수로 바뀌어 후행 테이블에 조인절 조건으로 공급됨
    ● 후행 테이블은 계속 루프를 돌면서 선행 테이블의 상수 공급이 종료될 때까지 조인을 시도함


    ● 조인 되는 후행 테이블의 조인 컬럼에 인덱스가 존재해야 함
    ● 인덱스가 없으면 후행 테이블을 반복적으로 FULL TABLE SCAN 하므로 비효율적

    ● 2개 이상의 테이블에서 하나의 집합을 기준으로 순차적으로 상대방 ROW를 결합해 원하는 결과를 조합

 

    ● 조인해야 할 데이터가 많지 않은 경우에 유용하게 사용

    ● 드라이빙 테이블로 한 테이블을 선정하고 이 테이블로부터 WHERE 절에 정의된 검색 조건을 만족하는 데이터들을 필터링 한 후 , 이 값을 가지고 조인 대상 테이블을 반복적으로 검색해 결과값을 도출함.

 

* 드라이빙 테이블이란?

JOIN을 할 때 먼저 액세스 되는 테이블 (+ 나중에 액세스되는 테이블은 DRIVEN TABLE)

중첩 루프 조인 예시

중첩  루프 조인 더 잘 사용하는 방법

● DRIVING TABLE 선정 시 WHERE 절로 최대한의 데이터를 필터링할 수 있는 테이블이나 데이터의 양이 적은 테이블로 선정하는 것이 좋음!

 


SORT MERGE

: 두 테이블의 조인 컬럼으로 각각 정렬한 다음, 정렬 값을 서로 비교하면서 조인하는 방식
  중첩 루프 조인에서 조인 횟수에 의한 랜덤 액세스가 부담되는 경우에 사용


: 정렬 작업은 PGA 메모리를 사용하므로 조인 대상 건수가 많을수록 정렬을 위한 부담이 증가
  메모리 SORT_AREA_SIZE로 최적화

 

: 조회의 범위가 많을 때 주로 사용

● 연결 고리에 인덱스가 전혀 없는 경우

● 대용량의 자료를 조인할 때

● 조인 조건으로 <,>,<=,>=와 같은 범위 비교 연산자 사용된 경우

● 인덱스 사용에 따른 랜덤 액세스의 오버헤드가 많은 경우

 

 


HASH JOIN

   ● Driving 테이블로 하나를 선택
    Hashing을 통해 해시값을 만들어 메모리 적재


    ● 다음으로 조인해야 할 테이블로부터 데이터를 읽어서
    Hashing을 통해 해시값을 만듬

 

    ● 비용 기반 옵티마이저를 사용할 때만 사용될 수 있으며, '=' 비교를 통한 조인에서만 사용 가능
    
    메모리 HASH_AREA_SIZE로 최적화(SORT_AREA_SIZE 2배가 기본값)
    
Hash JOIN 사용기준 
    수행 빈도가 낮고
    쿼리 수행 시간이 오래 걸리는
    대량 데이터 조인할 때(효율적이나 cpu를 많이 잡아먹기 때문)