728x90
반응형
데이터베이스에서 Join은 여러 테이블을 연결해 원하는 결과를 만드는 핵심 도구입니다.
Oracle SQL에서는 크게 두 가지 차원에서 조인을 이해할 수 있습니다.
- 논리적 조인(Logical Join): 결과 집합 관점 → 어떤 데이터를 가져올까?
- 물리적 조인(Physical Join): 실행 계획 관점 → 데이터를 어떻게 가져올까?
이번 포스팅에서는 논리적 조인 6가지 유형과 물리적 조인 3가지 방식을 다이어그램, SQL 예제와 함께 정리해보겠습니다.
🔹 1. 논리적 조인 (Logical Join)
① Inner Join
- 교집합: 두 테이블 모두에 존재하는 데이터만 가져옴.
SELECT a.*, b.*
FROM A a
INNER JOIN B b
ON a.key = b.key;
📌 활용: 고객-주문 관계에서 실제 주문이 있는 고객만 추출
② Left Outer Join
- A 기준 전체 + 매칭된 B
SELECT a.*, b.*
FROM A a
LEFT JOIN B b
ON a.key = b.key;
📌 활용: 모든 고객을 가져오고, 주문이 없는 고객도 표시
③ Right Outer Join
- B 기준 전체 + 매칭된 A
SELECT a.*, b.*
FROM A a
RIGHT JOIN B b
ON a.key = b.key;
④ Full Outer Join
- 합집합: 어느 한쪽에만 있어도 포함
⑤ Left Anti Join (A - B)
- A에는 있지만 B에는 없는 데이터
SELECT a.*
FROM A a
LEFT JOIN B b
ON a.key = b.key
WHERE b.key IS NULL;
⑥ Right Anti Join (B - A)
- B에는 있지만 A에는 없는 데이터
SELECT b.*
FROM A a
RIGHT JOIN B b
ON a.key = b.key
WHERE a.key IS NULL;
🔹 2. 물리적 조인 (Physical Join)
논리적으로는 같은 SQL이라도, 옵티마이저가 선택하는 실행 계획에 따라 실제 조인 방식이 달라집니다.
① Nested Loop Join
- **작은 집합(Outer)**에서 Row를 하나씩 읽고, **큰 집합(Inner)**에서 인덱스를 통해 매칭
- 장점: 소량 데이터, 인덱스 활용 시 빠름
- 힌트: USE_NL
SELECT /*+ USE_NL(b) */ a.col, b.col
FROM A a
JOIN B b ON a.id = b.id;
📌 활용: OLTP 트랜잭션 조회 (예: 특정 고객의 주문 상세 검색)
(다이어그램: Outer → Prefetch → Inner Index → Inner Table)
② Hash Join
- 작은 테이블을 메모리에 Hash Build → 큰 테이블을 Probe하면서 매칭
- 장점: 대용량 조인, 인덱스 불필요
- 힌트: USE_HASH
SELECT /*+ USE_HASH(b) */ a.col, b.col
FROM A a
JOIN B b ON a.id = b.id;
📌 활용: DW, 배치성 통계 쿼리
(다이어그램: Table A → Hash Build / Table B → Probe → Match)
③ Sort-Merge Join
- 두 테이블을 조인 키 기준으로 정렬 후 병합
- 장점: 이미 정렬된 데이터, 범위 조인 시 유리
- 힌트: USE_MERGE
SELECT /*+ USE_MERGE(b) */ a.col, b.col
FROM A a
JOIN B b ON a.id = b.id;
📌 활용: 기간별 거래 데이터와 고객 데이터 조인
(다이어그램: Table A → Sort / Table B → Sort → Merge → Output)
🔹 3. 요약 비교
구분 | 유형 | 특징 | 적합한 상황 |
논리적 조인 | Inner / Left / Right / Full / Left Anti / Right Anti | 어떤 데이터를 가져올지 정의 | 결과 집합 설계 |
물리적 조인 | Nested Loop / Hash / Sort-Merge | 데이터를 어떻게 가져올지 정의 | 실행 계획 최적화 |
🔹 마무리
- SQL 작성 시에는 논리적 조인을 통해 원하는 결과를 정의합니다.
- 성능 문제 발생 시에는 실행 계획을 확인하고, Nested Loop / Hash / Sort-Merge 중 어떤 방식이 쓰이는지 분석해야 합니다.
- 힌트를 활용해 옵티마이저의 선택을 유도할 수도 있습니다.
728x90
반응형
'데이터베이스 > Oracle' 카테고리의 다른 글
[DB/Oracle] SQL 튜닝 내용 정리 : 개념부터 DBMS_XPLAN, MONITOR까지 (0) | 2025.09.30 |
---|---|
[DB/Oracle] 오라클 SQL 옵티마이저 (0) | 2025.09.25 |
[DB/Oracle] Oracle Index (0) | 2025.09.23 |
[DB/Oracle] Oracle Data Block이란? (0) | 2025.09.18 |
[DB/Oracle] 계층형 쿼리로 Q&A 게시판 구현하기 (0) | 2025.09.17 |
댓글