Driving Table (드라이빙 테이블, 선행 테이블)
Table들을 JOIN(결합)할 때 먼저 ACCESS(처리)이 되는 Table를 Driving Table(드라이빙 테이블)이라고 합니다.
간단하게 FROM 절에 있는 Table이 Driving Table(드라이빙 테이블)이라고 생각하면 됩니다.
결합되는 다른 Table를 Driven Table(드리븐 테이블) 또는 Inner Table(인너 테이블)이라고 합니다.
그래서 처리할 Row가 적은 Table이 Driving Table(드라이빙 테이블)이 되는 것이 좋습니다.
예를 들어, Table1의 Row가 100만 건, Table2의 Row가 1만 건이면 Table2가 Driving Table(드라이빙 테이블)이 되는 것이 좋습니다.
또한, WHERE 절의 조건문으로 처리할 Row 수를 줄이는 것이 좋습니다.
JOIN
Table 사이에 Related Column(서로 관련된 열)을 기반으로 Row를 Combine(결합)합니다.
우선, JOIN 알고리즘에 대해 알아보겠습니다.
Nested Loop Join (NL Join - 중첩 루프 조인)
결합할 Table들을 순차적으로 돌면서 조건에 맞는 Row를 결합하는 방식입니다.
MySQL, MariaDB는 Nested Loop Join만 지원합니다.
Nested Loop Join(중첩 루프 조인)은 두 Table이 이중 FOR문처럼 동작합니다.
for(int row1 = 0; row1 < 10000; row1++) {
Outer Loop (Driving Table – Table2)
for(int row2 = 0; row2 < 1000000; row2++) {
Inner Loop (Driven Table – Table1)
}
}
그런데 Driven Table(Table1)에 INDEX가 없으면 전체 Row를 스캔해야 하기 때문에 Table1이나 Table2가 Driving Table이 되어도 검색 시간은 동일합니다.
그래서 JOIN되는 Driven Table의 Join Column은 INDEX로 되어 있어야 합니다.
(INDEX로 데이터의 위치를 빠르게 찾게 되어 검색 시간이 줄어 빠르게 처리됩니다.)
즉, Driving Table(드라이빙 테이블)은 Row 수만큼 반복하고 Driven Table(드리븐 테이블)은 INDEX로 검색하게 됩니다.
Driving Table(드라이빙 테이블)의 Join Column이 PK, Driven Table(드리븐 테이블)의 Join Column이 FK라면 문제가 되지 않지만 두 Table의 Join Column이 PK이거나 FK가 아니면 INDEX를 생성해야 합니다.
Sort Merge Join (정렬 병합 조인)
결합할 Table들에서 Join Column를 기준으로 정렬한 다음 조건에 맞는 Row를 결합하는 방식입니다.
- Sort 단계 : Table의 Join Column 기준으로 정렬
- Merge 단계 : 정렬된 Table를 조건에 맞게 병합
Table이 정렬되어 있기 때문에 Merge 단계에서 스캔 시작 위치를 매번 계산할 필요가 없습니다.
즉, Join Column를 기준으로 정렬된 Driven Table(드리븐 테이블)은 Driving Table(드라이빙 테이블)의 Row와 동일하게 정렬되어 있어 스캔이 완료되면 중지하고 Driving Table의 다음 Row에 맞게 중지된 위치에서 스캔을 시작하게 됩니다.
Hash Join (해시 조인)
결합할 Table 중 처리할 Row가 작은 Table를 읽어 Hash 함수로 계산하여 Hash Table를 생성하고 Row가 큰 Table를 읽어 Hash 함수로 계산하여 Row를 결합하는 방식입니다.
- Build 단계 : 처리할 Row가 작은 Table를 읽어 Hash 함수로 계산하여 Hash Table 생성
- Probe 단계 : Row가 큰 Table를 읽어 Hash 함수로 계산하여 결합
참고로, Sort Merge Join과 Hash join은 Database Server의 PGA(Program Global Area - 프로그램 전역 영역)에서 처리됩니다.
'Database' 카테고리의 다른 글
MariaDB SQL INDEX - CREATE/DROP/ALTER INDEX (0) | 2022.08.14 |
---|---|
MariaDB SQL JOIN - INNER JOIN, LEFT JOIN (LEFT OUTER JOIN), RIGHT JOIN (RIGHT OUTER JOIN) (0) | 2022.08.14 |
MariaDB SQL SELECT Statement (0) | 2022.08.14 |
MariaDB SQL DELETE Statement (0) | 2022.08.14 |
MariaDB SQL UPDATE Statement (0) | 2022.08.14 |