스칼라 서브쿼리
- 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
- 중복 데이터 : 중복 데이터로 인한
DISTINCT나 GROUP 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이 성능면에선 더 유리하다고 생각한다.