'면접을 위한 CS 전공지식 노트' 책을 보며 공부한 내용입니다.
조인은 조인의 원리를 기반으로 조인 작업이 이루어진다.
조인의 원리는 중첩 루프 조인, 정렬 병합 조인, 해시 조인이 있다.
중첩 루프 조인
- 중첩 for문과 같은 원리로 조건에 맞는 조인을 하는 방법이다.
- 랜덤 접근에 대한 비용이 많이 증가해서 대용량의 테이블에서는 사용하지 않는다. (디스크 접근 문제)
- 예시
- t1, t2 테이블을 조인한다라고 했을 대, t1 테이블에서 한번에 하나의 행을 가져와서 읽고, t2 테이블에서도 한번에 하나의 행을 가져와서 읽어서 조건에 맞는 레코드를 찾아 결과값을 반환한다.
- 중첩 루프 조인에서 발전한 조인할 테이블을 작은 블록으로 나누어서 블록 하나씩 조인하는 블록 중첩 루프 조인도 있다.
- pseudo code
for each row in t1 matching reference key {
for each row in t2 matching reference key {
if row satifies join conditions, send to client
}
}
정렬 병합 조인
- 각각의 테이블을 조인할 필드 기준으로 정렬하고 정렬이 끝난 이후에 조인 작업을 수행하는 조인이다.
- 조인할 때 쓸 적절한 인덱스가 없고, 대용량의 테이블들을 조인하고 조인 조건으로 '<', '>' 등 범위 비교 연자가 있을 때 쓴다.
해시 조인
- 해시 테이블을 기반으로 조인하는 방법이다.
- 두개의 테이블을 조인한다고 했을 때, 하나의 테이블이 메모리에 온전히 들어간다면 보통 중첩 루프 조인보다 더 효율적이다.
- 메모리에 전부 올릴 수 없을 정도로 크면 디스크 사용 비용이 발생한다.
- 또한, 동등(=) 조인에만 사용할 수 있다.
- MySQL의 해시 조인 단계는 빌드 단계, 프로브 단계로 나뉜다.
- 빌드 단계
- 입력 테이블 중 하나를 기반으로 메모리 내 해시 테이블을 빌드하는 단계
- 예시
- persons와 countries라는 테이블을 조인
- -> 둘 중에 바이트가 더 작은 테이블을 기반으로 인메모리 해시 테이블을 빌드한다.
- -> 또한, 조인에 사용하는 필드가 해시 테이블의 키로 사용된다. 'countries.countries_id'가 키로 사용된다고 가정.
- 프로브 단계
- 프로브 단계동안 레코드 읽기를 시작한다. 각 레코드에서 해시 테이블을 기반으로 'persons.countries'에 일치하는 레코드를 찾아서 결과값을 반환한다.
- 이를 통해 각 테이블은 한번씩만 읽게 되어 중첩해서 두개의 테이블을 읽는 중첩 루프 조인보다 보통은 성능이 더 좋다.
- (사용 가능한 메모리양은 시스템 변수 join_buffer_size에의해 제어되며, 런타임 시에 조정 가능하다.)
- 빌드 단계
예상 질문
1. DB란?
일정한 규칙, 혹은 규약을 통해 구조화되어 저장되는 데이터의 모음입니다.
데이터베이스를 제어, 관리하는 통합 시스템을 DBMS라 하며, 데이터베이스 안에 있는 데이터들은 특정 DBMS마다 정의된 쿼리 언어를 통해, 삽입, 삭제, 수정, 조회 등을 수행할 수 있습니다.
또한, 데이터베이스는 실시간 접근과 동시 공유가 가능합니다.
2. 중첩 루프 조인?
중첩 for문과 같은 원리로 조인 조건에 조인을 하는 방법입니다.
랜덤 접근에 대한 비용이 증가할 수 있습니다. 그래서 대용량 테이블에서는 사용하지 않습니다.
예를 들어, t1과 t2 테이블을 조인한다고 했을 때, t1 테이블에서 한번에 하나의 행을 읽고, t2 테이블에서 한번에 하나의 행을 읽어서 조인 조건에 맞는 레코드를 찾아 결과값을 반환합니다.
3. 인덱스를 매번 설정하는게 좋냐?
인덱스는 두번 탐색을 강요합니다. 인덱스 리스트와 컬렉션을 탐색해야 해서 읽기 비용이 증가하게 됩니다.
그리고 데이터를 수정하면 인덱스도 수정해야 하고, 인덱스는 B-트리라는 구조를 사용해서 트리의 높이를 균형있게 조절하는 비용과 데이터를 분산시켜서 효율적으로 조회할 수 있도록 하는 비용이 듭니다.
그래서 인덱스를 매번 설정하는 것은 비효율적일 수 있습니다.
728x90
'CS' 카테고리의 다른 글
5.2 선형 자료 구조 (0) | 2024.10.18 |
---|---|
5.1 복잡도 (1) | 2024.10.01 |
4.6 조인의 종류 (1) | 2024.09.28 |
4.5 인덱스 (0) | 2024.09.27 |
4.4 데이터베이스의 종류 (2) | 2024.09.26 |