[MySQL, Oracle] 스칼라 서브쿼리와 LEFT JOIN

이도형·2025년 12월 30일

쿼리 튜닝🔧

목록 보기
1/4

스칼라 서브쿼리

  • SELECT 절에 위치하여 한 행당 정확히 하나의 값만 반환하는 서브쿼리
SELECT u.SEQ
     , u.NAME
     , (SELECT c.CODE_NAME 
        FROM CODE c 
        WHERE u.CODE_SEQ = c.CODE_SEQ) AS CODE_NAME
 FROM USER u;

LEFT JOIN

  • 왼쪽 테이블을 기준으로 오른쪽 테이블을 결합하는 방식, 결합할 데이터가 없으면 NULL 처리.
SELECT u.SEQ
     , u.NAME
     , c.CODE_NAME
 FROM USER u 
 LEFT OUTER JOIN CODE c
   ON u.CODE_SEQ = c.CODE_SEQ;

장점

스칼라 서브쿼리

  • 가독성
  • 코드의 간결성
  • 데이터의 유일성 : 반드시 하나의 값만 반환되므로, 데이터 뻥튀기(Cartesian Product) 위험 감소

LEFT JOIN

  • 성능 : 인덱스 활용을 최적화하기에 유리
  • 다중 컬럼 추출 : 한 번의 JOIN으로 여러 컬럼 동시에 추출 가능
  • 유연성 : 복잡한 필터링 및 집계 작업이 쉽고, 튜닝 여지가 넓음

단점

스칼라 서브쿼리

  • 성능 : 서브쿼리 반복 실행(RBAR: Row-By-Agonizing-Row)을 통한 성능 ㅈ저하
  • 확장성 부족 : 단 하나의 컬럼만 가지고 올 수 있다는 건, 여러 컬럼 필요 시 서브쿼리 여러 개 필요함

LEFT JOIN

  • 중복 데이터 : 중복 데이터로 인한 DISTINCTGROUP BY처리 필요
  • 쿼리 복잡도 : 테이블 개수가 늘어나면 JOIN 관계가 복잡해짐
  • NULL문제 : 매칭이 없을 때 NULL로 나와 숫자는COALESCE등으로 보정이 필요

유리한 상황

스칼라 서브쿼리

  • 단일성 보장 시 : PK/Unique 제약이 필요해서 다중 행일 때 쿼리가 터지게 하고 싶은 경우
  • 단일 값 계산/집계 : SELECT A.id, (SELECT MAX(B.dt) FROM B WHERE B.id = A.id) AS last_dt ...와 같이 단일 집계값이 필요할 때

LEFT JOIN

  • 2개 이상 컬럼이 필요할 때
  • 성능 최적화 : 대량 데이터 조회/배치 작업 시

실무에서 어떻게 쓸 것인가?

  • 성능 및 대량 데이터 -> LEFT JOIN을 우선적으로 고려
  • 비즈니스 상 1대1 관계 + 가독성 -> 스칼라 서브쿼리 우선적 고려

스칼라 서브쿼리가 느릴때, LEFT JOIN으로 바꾸는건 좋은 선택!
단, LEFT JOIN + 중복 JOIN의 경우 스칼라 서브쿼리로 단순화 해 탐색 횟수를 줄일 수도 있음

결론

가독성 및 통일성으로 인해 쿼리 함수를 자주 사용했으나,
이는 스칼라 서브쿼리 사용을 유도해 성능이 저하되었다.
이로 인해, 공부를 하게 되었고 두 방법의 장단점을 비교하였는데,
역시 LEFT JOIN이 성능면에선 더 유리하다고 생각한다.

profile
열심히 살고 싶습니다! 일하고 싶습니다 :)

0개의 댓글