데이터베이스에서는 집합 계념이 중요한데요. 집합의 연산은 바로 조인입니다. 그 조인 중 가장 많이 사용되는 방식이 Nested Loop Join입니다. 데이터베이스에서는 조인은 Nested Loop Join, Hash Join, Merge Join 등 방법이 있습니다.
Nested Loop Join은 가장 일반적이면서도 효과적인 조인 방식입니다. 이글에서는 Nested Loop Join의 특징 및 장단점에 대해 자세히 살펴보도록 하겠습니다.
Nested Loop Join이란
명칭을 그대로 번역하면 '중첩 루프 조인'이라고 하는데요. 줄여서 NL 조인이라고도 합니다. 중첩 루프(nested loop)라는 말을 해석해 보면 '루프'라는 용어는 반복을 나타내고, '중첩'이라는 것은 여러 개가 겹치는 것을 의미합니다.
즉, 반복문 여러 개가 겹쳐 있는 구조를 중첩 루프라고 합니다. Nested Loop 조인은 한 테이블(outer table)의 각 행을 반복하고 지정된 조건에 따라 다른 테이블(Inner table)의 행과 일치시키는 방식으로 처리됩니다.
좀 더 이해를 돕기 위해 아래와 같은 for문 예시를 들겠습니다. 이런 중첩된 for루프문이 있다고 했을 때 첫 번째 for문이 Outer에 있으므로 먼저 읽은 다음에 다음 for문 Inner를 읽는 방식으로 동작합니다. 외부(outer)에 있는 for문으로 시작해서 내부(inner) for문이 다돌아가고, 다음 외부 for문으로 진행하는 방식이죠.
1
2
3
4
5
6
|
for (i = 0; i < OuterTableCount; i++)
{ for (j = 0; j < InnerTableCount; j++)
{
// 실제 로직 구현
}
}
|
cs |
Outer Table, Inner Table vs Driving Table, Driven Table
위에서 설명에서 이야기 했듯이 먼저 드라이빙(Driving)되는 테이블을 Outer Table이라고 하고, 뒤에 읽히는 테이블을 Inner Table이라고 합니다. 결국엔 Driving Table이 Outer Table이고 Driven Table이 Inner Table인 것입니다. 전문가들 사이에서도 Outer Table이라는 표현을 많이 사용하는데요. 처음에는 저조차도 많이 헷갈리더라고요.
그런데 말입니다. 왜 굳이 Outer Table, Inner Table이라는 용어를 사용할까요? 제가 생각하기에는요. 좀더 아마 아는 척하고 싶은 마음으로 생각되더군요.
Outer, Inner Table을 알려면 중첩 루프의 걔념을 알아야 하고 그게 좀 더 학문적인 설명일지는 모르겠습니다. 하지만 사실 더 이해하기 쉬운 Driving Table, Driven Table이라는 용어가 훨씬 편합니다. 저도 이 용어를 많이 사용하고요.
★ 핵심정리
- Outer Table = Driving Table (먼저 읽는 테이블)
- Inner Table = Driven Table (나중에 읽는 테이블)
Nested Loop Join의 특징
- Outer Table의 집합이 전체 작업량을 좌우하게 됩니다. 이유는 Outer의 결과로 Inner 집합에 접근(access)하기 때문에 결국 access 횟수를 결정하게 됩니다.
- 결국, 처음에 드라이빙 되는 테이블은 작은 테이블이 올 수록 성능에 유리합니다.
- Join을 진행할 때 한 Record씩 순차적으로 진행하는 방식입니다.
- Index를 통한 랜덤 액세스(Random Access) 위주의 Join을 수행합니다.
장점
- 결과 집합의 크기가 상대적으로 작을 때 반복 속도가 빨라지는 쿼리에 효율적임
- 확실한 인덱스가 있어 조인에 활용하는 경우 적합
- 조인 조건이 선택적일 때, 즉 Inner Table 행의 작은 하위 집합이 Outer Table의 각 행과 일치할 때 좋은 성능을 보임
- Paging 처리 등 부분 범위 처리가 가능한 Join 방식(OLTP 환경에 적합)
단점
- 대규모 데이터에서 성능 저하 : 데이터가 커짐에 따라 Nested Loop Join의 효율성이 감소하므로 해시 조인 또는 머지 조인을 추천
- Inner Table의 많은 부분이 Outer Table의 각 행과 일치하는 경우 Nested Loop Join은 비효율적이며 처리 시간이 늘어날 수 있음
- Inner table 에 Index가 반드시 필요함
- 대용량 처리 시 치명적인 한계점 발생
SQL Hash Join(해시 조인) - Build Input, Probe Input
'데이터베이스' 카테고리의 다른 글
SQL Sort Merge Join(소트머지 조인) (1) | 2023.11.30 |
---|---|
오라클 힌트(hint) 종류 및 사용법 (1) | 2023.11.29 |
실행 계획 보는 법 - SQL 튜닝 (0) | 2023.11.27 |
[SQLD] 데이터베이스 인덱스(Index) 왜 사용할까? (1) | 2023.11.24 |
[SQLD] 조인(Join) 종류(3) - Full Outer, Natural, Cross 조인 (1) | 2023.11.23 |