데이터베이스

[데이터베이스] 조인기법

남드로이드 2021. 8. 22. 01:44

NL 조인 (Nested Loop)

사용힌트 : +use_nl(table)

 

방식

기본적인 루프방식의 조인으로, 프로그래밍의 반복문과 동일하게 조인하는 방식.

for (i=0;i<100;i++){    -- 선행테이블(outer loop)
    for(j=0;j<100;j++){    -- 후행테이블(inner loop)
        - 주어진 조건에 따라 선행테이블 조회
        - 조인키값으로 후행테이블의 데이터를 조회하여 조인
    }
}

장점

한 레코드씩 조인을 진행한다. => 즉각적으로 결과를 보여주기에 좋다.

단점

랜덤액세스 위주의 방식이다. => 대량데이터 처리에 안좋음.

 

동작예시

1. EMP(PK_EMP) index scan : 5 블록 -> 100 rows

2. EMP table access (rowid) : 100 rows

3. DEPT(PK_DEPT) index scan : 100번 조인

4. DEPT table access (rowid) : 5 rows

=> 이 경우 A는 인덱스를 이용해 100개의 rowid를 찾았고, 이 rowid로 테이블엑세스를 통해 필터링 제외건 없이 100개의 row를 찾았기 때문에 아주 효율적임. B와 조인을 100번 시도했으나, 필터링된 데이터는 5 row 뿐이므로, 순서변경을 고려.


Sorted Merge 조인

사용힌트: +user_merge(table)

PGA(Private Global Area)는 프로세스 고유 데이터 공간

방식

Sort와 Merge 두가지 단계로 동작함.

1. Sort : 양쪽 집합을 조인 컬럼 기준 정렬하여 PGA에 저장.

2. Merge : 정렬한 양쪽 집합을 merge.

 

장점

1. 데이터를 '일괄적으로' 일거 PGA에 두고 사용하는 점에서 NL조인보다 빠르다.
    = 랜덤액세스 부하가 없다.

2. 인덱스가 없어도 사용할 수 있다.

단점

1. PGA가 부족할 경우 디스크(Temp) 공간을 사용하게 되어 성능이 저하될 수 있다.

 

동작예시

1. A,B 테이블 각각 정렬한 내용을 PGA의 Sort Area 에 저장한다. 이 공간이 부족하면 디스크(Temp) 공간을 사용한다.

2. 정렬된 A테이블을 스캔하며 정렬된 B 테이블과 조인한다.

 


Hash 조인

사용힌트: +use_hash(table)

 

 

랜덤액세스
한번에 하나의 블록에 액세스 하는 싱글블록 I/O 방식
TABLE FULL SCAN의 경우 여러개의 블록에 액세스하는 멀티블록 I/O를 사용

         

 

참고

친절한 SQL 튜닝

https://hoon93.tistory.com/46

https://coding-factory.tistory.com/744