조인 알고리즘
- 다수의 테이블에서 조인을 수행할 때는 동시에 여러 개의 테이블에 접근할 수 없기 때문에, 내부적으로 접근할 순번을 정해서 차례로 테이블에 접근한 결과를 다음 순번의 테이블로 전달한다.
- 이때 테이블에 접근하는 선후 관계에 따라 드라이빙 테이블과 드리븐 테이블로 구분한다.
- 드라이빙 테이블에서 많은 건수가 반환되면 해당 결과를 가지고 드리븐 테이블에 접근하게 되므로, 가능하면 적은 결과가 반환될 것으로 예상되는 드라이빙 테이블을 선정하고, 조인 조건절의 열이 인덱스로 설정되도록 구성해야 한다.
중첩 루프 조인 (NL 조인)
- 드라이빙 테이블의 데이터 1건당 드리븐 테이블을 반복해 검색하며 최종적으로는 양쪽 테이블에 공통된 데이터를 출력한다.
- 인덱스는 인덱스로 정의된 열 기준으로 순차 정렬되지만, 인덱스를 이용해 테이블의 데이터를 찾아가는 과정에서 임의 접근 방식인 랜덤 액세스가 발생한다.
- 따라서, 랜덤 액세스를 줄일 수 있도록 데이터의 액세스 범위를 좁히는 방향으로 인덱스를 설계하고 조건절을 작성해야 한다.
- 랜덤 액세스를 유발하는 인덱스는 기본키가 아닌 비고유 인덱스일 경우에 해당되며, 기본키는 클러스터형 인덱스이므로 기본키의 순서대로 테이블의 데이터가 적재되어 있어 조회 효율이 높다.
블록 중첩 루프 조인 (BNL 조인)
- 인덱스가 없는 드리븐 테이블에 대해 매번 전체 데이터를 검색하는 중첩 루프 조인의 문제를 해겨하기 위한 방법으로, 드라이빙 테이블에 조인 버퍼라는 개념을 도입하여 조인 성능을 향상시킨 방법
배치 키 액세스 조인 (BKA 조인)
- 중첩 루프 조인 방식은 데이터 접근 시 인덱스에 의한 랜덤 액세스가 발생하므로, 액세스할 데이터의 범위가 넓다면 비효율적이다.
- 이러한 랜덤 액세스의 단점을 해결하기 위해 접근할 데이터를 미리 예상하고 가져오는 조인 알고리즘을 배치 키 액세스 조인이라고 한다.
- BKA 조인은 블록 중첩 루프 조인에서 활용한 드라이빙 테이블의 조인 버퍼 개념을 그대로 사용하며, 드리븐 테이블에 필요한 데이터를 미리 예측하고 정렬된 상태로 담는 랜덤 버퍼의 개념을 도입한다.
- 이때 드리븐 테이블의 데이터를 예측하고 정렬된 상태로 버퍼에 적재하는 기능을 다중 범위 읽기(MRR)라고 한다.
- 미리 예측된 데이터를 가져와 정렬된 상태에서 랜덤 버퍼에 담기 때문에 드리븐 테이블에 대해 랜덤 액세스가 아닌 시퀀셜 액세스를 수행한다.
해시 조인
- 기존의 중첩 루프 조인 방식에서 조금 개선된 버전으로, MySQL 계열에서 최근 들어 제공하기 시작한 방식
- MariaDB에서도 5.3 이후 버전부터 블록 중첩 루프 해시라는 이름으로 해시 조인 기능을 제공 중이다.
- 해시 조인은 선후 관계를 두고 조인을 수행하는 중첩 루프 조인 방식과 달리, 조인에 참여하는 각 테이블의 데이터를 내부적으로 해시값으로 만들어 내부 조인을 수행한다.
- 해시값으로 내부 조인을 수행한 결과는 조인 버퍼에 저장되므로 조인 열의 인덱스를 필수로 요구하지 않는다.
'Computer Science > Database' 카테고리의 다른 글
NoSQL과 종류 (0) | 2022.03.29 |
---|---|
트랜잭션과 ACID (0) | 2022.02.22 |
`이상현상과 정규화 (0) | 2022.02.22 |
JOIN의 종류 (0) | 2022.02.19 |
`서브쿼리와 뷰 (0) | 2022.02.19 |