티스토리 뷰

DB

[DB] INNER JOIN vs EXISTS

snail voyager 2025. 5. 6. 19:26
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