티스토리 뷰
728x90
반응형
INNER JOIN
SELECT A.*
FROM TableA A
INNER JOIN TableB B ON A.id = B.id;
- INNER JOIN은 두 테이블을 결합한 후, 조인 조건에 맞는 레코드만 반환합니다.
- 조인 시 TableB의 중복된 id가 있으면 TableA의 해당 레코드가 여러 번 중복 반환될 수 있습니다.
- 실행 계획에서 JOIN 연산이 수행되며, 인덱스가 적절히 설정되지 않으면 성능 저하 가능성이 있습니다.
EXISTS
SELECT A.*
FROM TableA A
WHERE EXISTS (SELECT 1 FROM TableB B WHERE A.id = B.id);
- EXISTS는 TableB에서 A.id = B.id 조건을 만족하는 레코드가 존재하는지만 체크합니다.
- 서브쿼리에서 SELECT 1을 사용하여 데이터를 가져오지 않고 존재 여부만 판별하므로, 필요 이상의 데이터를 조회하지 않습니다.
- EXISTS는 보통 SEMI JOIN 형태로 동작하여, 첫 번째 일치하는 값이 발견되면 즉시 검사를 종료합니다.
성능 비교
1) INNER JOIN이 더 빠른 경우
- 두 테이블을 JOIN해야 할 때 INNER JOIN이 일반적으로 성능이 더 좋습니다.
- 특히, TableB의 id가 UNIQUE하고 JOIN 조건에 적절한 인덱스가 있을 경우, HASH JOIN 또는 MERGE JOIN이 효율적으로 동작할 수 있습니다.
- INNER JOIN은 결과 집합을 직접 반환하는 반면, EXISTS는 서브쿼리를 반복적으로 실행하므로 오버헤드가 발생할 수 있습니다.
2) EXISTS가 더 빠른 경우
- TableB의 행 개수가 매우 크고, TableA에 대한 필터링이 필요한 경우 EXISTS가 유리합니다.
- EXISTS는 서브쿼리에서 TableB의 첫 번째 일치하는 레코드만 찾으면 바로 종료되므로, INNER JOIN처럼 전체 테이블을 스캔할 필요가 없습니다.
- 특히, TableB에 중복된 id가 많으면 INNER JOIN의 경우 불필요한 중복 행이 발생할 수 있는 반면, EXISTS는 이러한 문제를 피할 수 있습니다.
| 조건 | INNER JOIN | EXISTS |
| 조인 테이블 크기 | 작은 경우 유리 | 큰 경우 유리 |
| 조인 키 인덱스 | 적절한 인덱스 있으면 빠름 | 인덱스 없는 경우 효과적 |
| 중복 데이터 | 중복 허용 시 유리 | 중복 데이터가 많을 경우 효율적 |
| 반환 데이터 크기 | 결과 집합이 클 경우 적합 | 결과 집합 크기가 작을 경우 유리 |
| 서브쿼리 조건 | 불필요한 중복을 제거해야 할 경우 비효율적 | 첫 번째 매칭 이후 중단 가능 |
728x90
반응형
'DB' 카테고리의 다른 글
| [Redis] ZSet(sorted set) (1) | 2026.01.10 |
|---|---|
| [DB] Join 순서 Driving Table, Driven Table (0) | 2025.05.06 |
| [Oracle] 물리적 조인 (Physical Join) (1) | 2025.05.06 |
| [MySQL] JSON 조회 JSON_TABLE (0) | 2025.04.29 |
| [MySQL] JSON 조회 JSON_EXTRACT (1) | 2023.12.06 |
반응형
300x250