본문 바로가기
IT ▶/Database

[SQL 기초] ORACLE JOIN 동작 원리

by Jordan_ 2019. 11. 13.
728x90
반응형

 

안녕하세요!

 

데이터베이스 쿼리에서 JOIN 자주 사용하는데

 

JOIN 구문 동작원리를 한번 알아보겠습니다.

 

 

 

<일반적인 데이터 조회 프로세스>

 

 

- 하드디스크에서 메모리로 복사

 

- 메모리에 있는 데이터를 복하새 CPU의 캐시 메모리로 가져가서 ALU와 레지스터 활용

 

- 캐시 메모리의 용량이 컴퓨터 속도에 큰 영향

 

- DBMS도 같은 원리로 1개의 데이터를 조회할 때 디스크에 저장된 테이블을 메모리로 복사합니다.

 

 

 

1>   Nested Loop Join (반복 Join)

 

 

SELECT a.name, b.position

FROM LIVERPOOL a, ENGLAND b

WHERE a.name = b.name

 

 

위 쿼리가 처리되는 과정은 아래와 같습니다.

 

 

1. LIVERPOOL 테이블과 ENGLAND 테이블을 데이터베이스 버퍼 캐시(메모리)로 복사

 

2. LIVERPOOL 테이블에서 첫 번째 선수 이름을 임시로 저장

 

3. ENGLAND 테이블에서 해당 선수명의 position을 조회

(WHERE 절의 조건에 따라 같은 name에 해당되는  position 매핑)

 

4.   끝나면 다시 LIVERPOOL 테이블에서 다음 데이터 처리 (반복 LOOP)

 

 

이와 같은 반복처리 방식은 테이블의 데이터 수 (행 수) 만큼 JOIN이 반복되어 실행됩니다.

 

테이블들을 순차적으로 접근하므로 먼저 탐색할 선행테이블 선택이 중요하다고 합니다.

 

이를 오라클에서 옵티마이저 (비용 기반 옵티마이저)에서 자동화되어 좋은 성능으로 수행되도록 해준다고 합니다.

 

 

 

2>   Sort-Merge JOIN (정렬 머지 조인)

 

 

SELECT a.name, b.position

FROM LIVERPOOL a, ENGLAND b

WHERE a.name = b.name

 

 

위의 쿼리에서 ENGLAND 테이블이 전체 영국 국가의 인원들이 있다고 가정하면,

 

ENGLAND 테이블에서 데이터를 찾기 위해 인구가 2억명이라 치면 데이터를 2억건을 읽어야 합니다.

 

이를 보완하기 위해 INDEX(인덱스) 설정이 필요합니다.

 

ENGLAND 테이블에 name 이 인덱스로 적용되어 있다면,

 

name에 해당되는 rownum 주소번호가 있기 때문에 테이블을 처음부터 다 읽지 않고,

인덱스에서 해당 데이터를 바로 찾을 수 있습니다.

 

 

 

Sort-Merge JOIN 방식은 정렬을 하고 Merge해서 데이터를 조회하는 방법입니다.

 

LIVERPOOL 테이블에서 name으로 정렬을 하고, ENGLAND 테이블에서 name으로 정렬하여서 비교하는 방식입니다.

 

단점은 양쪽 테이블 정렬하는 시간이 소요되는 부분입니다.

 

 

 

3>   HASH JOIN

 

 

이를 보완한 JOIN 방식이 양쪽 테이블에 INDEX가 없다면, Hash Join 방식으로 조회하는 것이 좋습니다.

 

 

1. 두 테이블을 비교하여 데이터가 적은 테이블을 메모리로 가져오기

 

2. JOIN 조건의 컬럼을 Hash 함수에 넣어 Value, Hash Table 생성하기

 

3. 2번째 테이블 JOIN 조건을 Hash 함수에 넣어 Value 생성하고, 위에서 만들 Hash Table 값과 비교하여 매핑

 

 

Sort 정렬 join보다 훨씬 효율적으로 처리하여 대용량을 처리할 때 성능이 좋습니다.

 

 

INDEX 관련 내용은 아래 참고하시기 바랍니다.

 

 

https://lovefor-you.tistory.com/183

 

데이터베이스 INDEX 개념과 INDEX 사용방법 알아보자. – by.SC

DATABASE INDEX * 인덱스(INDEX) : 어떤 데이터가 어디 위치하였는지 위치 정보를 가진 주소록 개념 1> 인덱스가 필요한 이유 일반적으로 SELECT 구문을 통해 데이터 조회 요청 DB 서버 프로세스는 Memory (DB 버..

lovefor-you.tistory.com

 

 

728x90
반응형