JOIN절 vs 서브쿼리

joona95·2025년 2월 2일

문제 상황

//예시 코드
SELECT
	a.id,
    ...
    (SELECT b.id FROM b WHERE b.age = 20)
FROM a
INNER JOIN c ON c.a_id = a.id
INNER JOIN d ON d.c_id = c.id
WHERE a.age = 10;

위와 같은 예시코드 상황에서 추가로 b 테이블에서 다른 값을 가져올 필요가 있었다.

이를 위한 방법으로는 아래와 같이 1) 서브쿼리 사용 2) JOIN절 사용이 있었다.

1) 서브 쿼리 사용

//예시 코드
SELECT
	a.id,
    ...
    (SELECT b.id FROM b WHERE b.age = 20),
    (SELECT b.code FROM b WHERE b.age = 20)
FROM a
INNER JOIN c ON c.a_id = a.id
INNER JOIN d ON d.c_id = c.id
WHERE a.age = 10;

2) JOIN 사용

//예시 코드
SELECT
	a.id,
    ...
    b.id,
    b.code
FROM a
INNER JOIN b ON b.age = 20
INNER JOIN c ON c.a_id = a.id
INNER JOIN d ON d.c_id = c.id
WHERE a.age = 10;

기존에 b 테이블에서 값을 하나 가져오고 있었는데, b 테이블에서 값을 하나 더 가져오는 것이라 또 서브쿼리문을 사용하는 것보다는 JOIN을 사용하는 게 보기에 낫지 않나 싶었다.

그러나 테이블에서 성능적으로 서브쿼리가 더 효율적인지 JOIN절 사용이 더 효율적인지 고려해볼 필요가 있다는 지적을 듣게 되어 그 고민을 기록해보고자 한다.


JOIN절

  • 인덱스를 잘 활용하여 실행 계획에서 Nested Loop / Hash Join / Merge Join 같은 최적화된 방식이 적용됨

  • 한 번의 쿼리로 여러 테이블의 데이터를 조회할 수 있음

  • JOIN ON절로 조건 설정하여 원하는 데이터만 가져올 수 있음

  • 대량 데이터를 빠르게 조회해야 할 때 사용하기 좋음

  • 조인 테이블이 많아지면 성능 저하 가능성이 높음

  • 잘못된 조인 조건을 사용하면 의도하지 않은 카다시안 곱이 발생하며 성능 저하가 일어날 수 있음

서브쿼리

  • 간단한 서브쿼리는 가독성이 좋음

  • 특정 값을 조회하거나 집계하는 경우 서브쿼리 사용이 유리

  • 대량 데이터를 처리해야 하는 경우 성능 저하 가능성이 높음

  • 서브쿼리는 보통 각 행마다 실행되므로 성능이 저하될 가능성이 높음

  • 인덱스를 활용하기 어렵고 경우에 따라 비효율적인 실행 계획이 생성될 수 있음


결론

결론적으로 JOIN절 대신 서브쿼리를 사용하여 SQL문 수정을 하기로 결정했다.

기존 SQL문 내에 JOIN절을 이미 많이 사용하고 있어서 여러 테이블 조회로 인해 이미 어느정도 부하가 있는 상태였다.

그리고 b 테이블이 가지고 있는 정보값도 많은데 그 중에 단 두 개를 가져오는 것이기 때문에 오히려 이 편이 성능적으로 더 나을 것으로 보였다.

또한 서브쿼리를 사용했을 때 조건값이 인덱스를 타기 때문에 실행 계획 상으로도 더 나은 성능을 보이는 것으로 나타났다.

0개의 댓글