✨ JOIN?
조인은 두 개 이상의 테이블을 하나의 집함으로 만드는 것이다.
SQL 문에서 FROM 절에 두 개 이상의 테이블이 나열될 경우에 조인을 수행한다.
조인을 하는 테이블이 A, B, C 세 개가 존재할 때, DBMS에서는 동시에 수행을 하는 게 아니라, A와 B를 먼저 JOIN을 수행한 다음, 그 결과와 C를 JOIN 수행한다.
다음과 같이 수행되는 JOIN은 단계별로 다른 기법을 사용할 수 있는데, 자주 사용되는 것은
NL JOIN, HASH JOIN, SORT MERGE JOIN이 존재한다.
🪡 NL JOIN
NL JOIN은 중첩 FOR문과 그 방식이 유사하다고 할 수 있다.즉, 선행 테이블의 조건을 만족하는 행이 나오면, 후행 테이블을 읽으면서 조인을 수행하는 것이다. FOR문이 그러하듯 조건을 만족하는 모든 행의 수만큼 반복해서 진행된다. 그렇기 때문에 조건을 만족하는 행의 수가 많을 경우 그만큼 후행 테이블의 작업도 계속된다고 볼 수 있다.그렇기 때문에 처리 범위가 좁은 테이블을 조인 순서 상 선행 테이블로 하는 것이 전체적인 면에서 효율적이다.NL JOIN은 랜덤한 방식으로 데이터를 엑세스하기 때문에 처리 범위가 좁은 것이 유리하다. (순차 엑세스가 아니다)
NL JOIN의 작업 방식은 다음과 같다선행 테이블을 순회하며 주어진 조건을 만족하는 행을 찾음 -> 선행 테이블의 조인 키 값을 가지고 후행 테이블에서 조인 수행 -> 선행 테이블에서 조건이 맞는 모든 행에 대해 반복
이와 같은 결과값이 나오면, DBMS는 추출버퍼에 자료를 담아서 사용자에게 반환하는데 1.일정 크기를 설정해 추출 버퍼에 가득 차거나 2. 더이상 결과가 존재하지 않을 경우 이다.
FOR문과 같이, 조인이 성공할 경우 바로 조인 결과를 사용자에게 보여줄 수 있으므로 결과를 최대한 빨리 화면에 보여줘야 하는 온라인 프로그램에 적당한 기법이라고 볼 수 있다.
🧶 SORT MERGE JOIN
SORT MERGE JOIN은 조인 컬럼을 기준으로 데이터를 정렬하여 조인을 수행한다. 랜덤하게 엑세스하는 NL JOIN과 다른 점이 이것이다.
스캔 방식으로 읽기 때문에 넓은 범위의 데이터를 처리할 때 이용하기 좋은 기법이다. 그러나, 정렬할 데이터가 많아 메모리에서 모든 정렬 작업을 수행하기 어려운 경우 임시 영역(디스크) 를 사용하기 때문에 성능 저하가 일어날 수 있다.
이러한 단점 때문에 일반적으로는 대량의 정렬 작업이 필요한 SORT MERGE JOIN보다는 CPU 작업 위주로 처리하는 HASH JOIN이 성능상 유리하지만, 비동등 조인에 대해서도 조인 작업이 가능하다는 이점이 존재한다.
SORT MERGE JOIN에서는 조인 컬럼의 인덱스를 사용하지 않기 때문에 존재하지 않을 경우에도 사용할 수 있다.
또한, 항상 정렬 작업이 발생하는 것이 아니라 조인할 테이블 중 이미 앞 단계에서 정렬 작업이 미리 수행되었다면 다시 발생하지는 않을 수 있다.
SORT MERGE JOIN의 작업 과정은 다음과 같다
선행 테이블에서 주어진 조건을 만족하는 행을 찾음 -> 선행 테이블의 조인 키를 기준, 정렬 작업 수행 -> 선행 테이블의 조건을 만족하는 행에 대해 앞 순서반복 -> 후행 테이블에서 조건 만족하는 행을 찾음 -> 후행 테이블의 조인 키 이용하여 정렬 작업 수행 -> 만족하는 모든 행에 대해 앞의 두 순서 반복 -> 정렬된 결과 이용하여 조인 수행 후 성공하면 추출버퍼에 담음
🏹 HASH JOIN
HASH JOIN은 NL JOIN의 랜덤 엑세스 문제와 SORT MERGE JOIN의 정렬 작업 부담 문제를 해결하기 위한 대안으로 등장했다.
HASH JOIN은 해싱을 이용하여 조인을 수행한다. 조인을 수행할 테이블의 칼럼 기준으로 해쉬 함수를 수행하고, 서로 동일한 해시 값을 가지는 것 사이에서 실제 값이 동일한지 비교하며 조인을 수행한다.
HASH JOIN의 작업 과정은 다음과 같다
선행 테이블에서 조건을 만족하는 행을 찾기 -> 선행 테이블의 조인 키를 기준, 해쉬 함수를 적용하여 해쉬 테이블 생성 (조인 컬럼과 SELECT 절에서 필요한 칼럼도 함께 저장) -> 1~22번 작업을 선행 테이블의 조건을 만족하는 모든 행에 대해 반복 수행 -> 후행 테이블에서 조건 만족하는 행 찾기 -> 후행 테이블의 조인 키를 기준, 해쉬 함수를 적용하여 해당 버킷 찾기 -> 조인 키 이용, 실제 조인될 데이터 찾음 -> 조인에 성공하면 추출 버퍼에 넣음
HASH JOIN은 조인 칼럼의 인덱스를 사용하지 않기 때문에 조인 컬럼 인덱스가 존재하지 않아도 사용할 수 있다.
HASH JOIN은 해쉬 함수를 이용하기 때문에 적용될 때 큰 값이 항상 큰 값으로, 작은 값이 항상 작은 값으로 해싱된다는 보장이 없다. 그렇기 때문에 '=' 로 사용하는 이퀄 조인에서만 사용할 수 있다.
조인 작업을 하기 위해서는, 해쉬 테이블을 메모리에 생성, 적재를 해야 하는데 이때 생성된 해쉬 테이블의 크기가 메모리에 적재할 수 있는 크기가 넘어가면 임시 영역인 디스크에 할당된다. 그렇게 되면 추가적인 작업이 필요하기 때문에 위와 마찬가지로 결과 행이 적은 테이블을 선행으로 사용하는 것이 좋다.
🐣Hash?
해시를 처음 접하는 사람을 위해 조금 더 설명을 보태자면,
해시라는 것은 해시 메모리라는 영역을 할당하고, 자료를 해시 메모리에 저장하여 추출할 때는 그 메모리의 주소값을 가지고 오는 것을 말한다.
그렇기 때문에 계속해서 데이터에 접근하는 것보다 해시 메모리 내에서 접근을 하는 것이니 효율성이 높다고 볼 수 있다.
'DBMS' 카테고리의 다른 글
SQL 파싱 부하 (0) | 2024.04.09 |
---|---|
데이터베이스 아키텍처 (0) | 2024.04.08 |
인덱스 기본 (0) | 2024.04.04 |
옵티마이저와 실행계획 (0) | 2024.04.04 |
절차형 SQL (0) | 2024.04.04 |