JOIN은 특정 조건에 따라 여러 테이블을 하나의 SELECT 쿼리로 결합할 수 있게 해주는 키워드입니다. 일반적으로 ON 키워드를 사용합니다. 서브쿼리(또는 중첩 쿼리)는 다른 쿼리 안에 포함된 쿼리입니다. JOIN은 인덱스가 잘 설정된 큰 테이블을 결합하는 데 더 잘 작동하며, 최적화 프로그램에 더 명확하고 일반적으로 더 빠르게 실행됩니다. 서브쿼리는 집계 계산이 필요하거나 JOIN으로는 불가능한 조건이 있을 때 편리합니다(예: 상관 서브쿼리).
JOIN 예제:
SELECT employees.name, departments.name FROM employees JOIN departments ON employees.dept_id = departments.id;
서브쿼리 예제:
SELECT name FROM employees WHERE dept_id IN ( SELECT id FROM departments WHERE location = 'Moscow' );
“서브쿼리를 사용하는 것이 항상 JOIN보다 느리다고 여겨지나요?”
답변: 아닙니다, 항상 그런 것은 아닙니다! 적절하게 작성된 서브쿼리는 종종 최적화 프로그램에 의해 내부 JOIN으로 변환됩니다. 또한 경우에 따라 서브쿼리가 더 효율적일 수도 있습니다. 예를 들면, 외부 쿼리가 작은 데이터 집합을 처리할 때 서브쿼리가 사전에 집계된 결과를 반환하는 경우입니다.
예시:
SELECT name, salary FROM employees WHERE salary > (SELECT AVG(salary) FROM employees);
이 서브쿼리는 한 번만 실행됩니다.
스토리
큰 프로젝트에서 보고서를 위해 JOIN 대신 중첩 서브쿼리를 사용했습니다. 데이터 양이 증가하면서 쿼리 실행 시간이 초 단위에서 분 단위로 늘어났습니다. 서브쿼리를 JOIN으로 바꾼 후 성능이 10배 향상되었습니다.
스토리
하나의 프로젝트에서 분석가가 GROUP BY를 서브쿼리로 재작성하면서 JOIN 수준에서 중복이 발생하게 되었습니다. 이로 인해 보고서의 데이터가 정확하지 않게 되었고, 합계는 카르테시안 곱으로 인해 부풀려졌습니다.
스토리
외부 루프에서 상관 서브쿼리를 사용하는 것은 테이블 크기가 증가함에 따라 성능을 완전히 저하시키게 만들었습니다. 집계와 함께 JOIN을 사용하기로 결정했으며, 쿼리 처리 시간은 몇 시간에서 몇 분으로 줄어들었습니다.