1. SORT / MERGE JOIN

- 연결 고리에 인덱스가 전혀 없는 경우에 사용.
- 대용량의 자료를 조인해야 함으로써  인덱스 사용에 따른 랜덤 엑세스의 오버헤드가 많은 경우에 사용.

* 튜닝을 하기 위해서는 각 테이블로부터 데이터를 빨리 읽어 들이도록 해야 함.
  조인하기 전 정렬을 빠르게 하기 위해 메모리(SORT_AREA_SIZE)를 최적화해야 한다.


- 조인하고자 하는 각 테이블에 대해서 독립적으로 데이터를 읽어 들일 때, 이를 얼마나 빠르게 할 것 인가가 중요함 (FTS 인 경우, I/O 시 읽어 들이는 blocks 수를 늘리는 방법을 고려해 볼 수 있음.)
- 각 테이블로부터 읽혀진 데이터를 연결고리에 대해 정렬을 수행할 때 이를 얼마나 빠르게 할 것인가가 중요하다.

 


2. SORT / MERGE JOIN의 수행절차

① Driving, Driven Table이 없으므로 각 테이블에 대해 동시에 독립적으로 데이터를 먼저 읽어 들임
② 읽혀진 각 테이블의 데이터를 조인을 위한 연결 고리에 대하여 정렬을 수행함. (모든 테이블에 대한 정렬이 끝나야 다음 단계로 넘어갈 수 있음)
③ 정렬이 모두 끝난 후에 조인 작업이 수행됨

* 튜닝을 하기 위해서는 각 테이블로부터 데이터를 빨리 읽어 들이도록 해야 한다.

   또한, 정렬을 빠르게 하기 위해 메모리(SORT_AREA_SIZE)를 최적화해야 한다.

예시) color만 index가 존재하는 경우
SELECT /*+USE_MERGE(a b)*/
            a.color, ... , b.size, ...
FROM table_a a, table_b b
WHERE a.joinkey_a = b.joinkey_b
AND a.color = 'RED'
AND b.size = 'MED';

-> b테이블은 Full Table Scan을 타게 된다.


3. SORT / MERGE JOIN 이 불리한 경우

- JOIN하는 테이블의 정렬속도가 차이가 클 경우, 대기 시간이 크게 발생하므로 성능상 불리하다.
- 각 테이블로 읽어 들인 데이터의 크기가 매우 큰 경우
- 각 테이블로 읽어 들인 데이터를 조인 전, 정렬하는데 이때 정렬할 데이터가 지나치게 큰 경우


4. SORT / MERGE JOIN의 장단점

장점 : 연결고리에 인덱스가 생성되어 있지 않는 경우에 빠른 조인을 위하여 사용 가능
단점 : 각 테이블로부터 읽어 들인 데이터의 크기가 매우 큰 경우 성능상 불리함 

 (데이터 정렬 소요시간, 데이터 스캔 소요시간)


5. HASH JOIN

- NESTED LOOPS JOIN은 인덱스 사용에 의한 랜덤 엑세스 오버헤드 이슈가 있음.
- SORT/MERGE JOIN은 정렬작업으로 인한 오버헤드 이슈가 있음.

- SORT/MERGE JOIN과 비교해 보면, 각 테이블에 대한 처리를 독립적으로 하는 것은 같지만, HASH JOIN에서는 Driving Table이 존재함.
- 읽어 들인 각 테이블의 데이터를 서로 조인하기 위해 해싱(Hashing)을 이용해서 해시 값을 만듦 (Driving Table을 먼저 읽어 들여 해시값을 메모리에 올려두는 작업을 수행)
-> 해시 값으로 조인을 수행함.

* Driving table을 잘 결정해야함. (적은 양의 데이터를 가진 테이블을 선택하는 게 중요)
   각 테이블로부터 데이터를 읽어 들일 때, 빨리 읽을 수 있도록 함
   메모리(HASH_AREA_SIZE)를 최적화하는게 중요함. (보통 SORT_AREA_SIZE의 2배를 기본 값으로 설정)


6. HASH JOIN의 수행절차

① Driving Table 결정
② Driving Table의 연결조건 칼럼 해싱 및 해시 값 생성
③ 읽어 들인 데이터와 해싱에서 만들어진 해시 값을 메모리에 저장
④ Hash Join이 적용될 테이블의 연결조건 칼럼 해싱 및 해시 값 생성
⑤ 읽어 들인 데이터와 해싱에서 만들어진 해시 값을 메모리에 저장
⑥ 각 테이블에 조인할 데이터가 있는지, 조인하고자 만들었던 해시 값 간에 충돌이 있는지 확인

 (충돌이 있을 경우, 2차 해싱을 수행)
⑦ 각 테이블의 해시값을 '='로 조인을 수행함.


7. HASH JOIN의 장단점
- Hash Bucket이 조인 집합에 구성되어 해시 함수 결과를 저장해야 하는데 이러한 처리에는 많은 메모리와 CPU 자원을 소모하게 됨.
- 기본적으로 HASH_AREA_SIZE에 지정된 크기만큼의 메모리가 할당되어 사용됨.
* 조인을 수행하기에 메모리가 부족하다면 가장 큰 순서대로 Hash Bucket이 Temporary Tablespace로 내려가서 구성되며,
 디스크로 내려간 Hash Bucket에 변경이 일어날 때마다 디스크 I/O가 발생하게 되어 성능이 현저하게 저하된다.
  하드웨어 자원이 넉넉한 상황에서는 다른 조인에 비해 보다 효율적인 수행이 가능하지만, 부족한 상황에서는 다른 조인 방법보다 오히려 느려질 수 있다는 이슈가 발생.

장점 : 하드웨어 자원이 넉넉한 상황에서는 다른 조인에 비해 보다 효율적인 수행이 가능함
단점 : 하드웨어 자원이 부족한 상황에서는 다른 조인 방법보다 비효율적

'IT > SQL' 카테고리의 다른 글

Subquery  (0) 2023.07.25
Cartesian Product  (0) 2023.07.25
Nested Loop Join  (0) 2023.07.24
인덱스 활용이 불가능한 경우  (0) 2023.07.23
결합 인덱스(Composite Index)  (0) 2023.07.19

+ Recent posts