JOIN입문
CROSS JOIN
두 테이블의 모든 행을 모든 경우의 수로 조합하는 조인
정의
연결 조건 없이 두 테이블의 모든 행을 가능한 모든 조합으로 만든다. 결과 행 수는 A행수 × B행수가 된다. 카드 게임의 모든 카드 조합처럼, 한 쪽의 모든 행이 반대쪽의 모든 행과 짝지어진다. 의도적으로 쓰는 경우(달력 × 부서로 매트릭스 만들기)도 있지만, 대부분은 JOIN 조건을 빠뜨린 실수다.
왜 중요한가?
"JOIN 했는데 결과가 이상하게 많이 나온다"의 원인. 여러 테이블을 JOIN할 때 조인 조건 하나만 빠뜨려도 그 테이블이 모든 경우의 수로 곱해져서 결과가 폭증한다. 1만 × 1만 = 1억 행이 한순간에 만들어질 수 있다.
틀리기 쉬운 포인트
- !ON 조건이 빠진 JOIN은 자동으로 CROSS JOIN이 됩니다. 옵티마이저는 경고하지 않습니다.
- !의도된 CROSS JOIN은 명시적으로 CROSS JOIN 키워드를 쓰는 것이 가독성에 좋습니다.
- !결과 행 수는 양쪽 행 수의 곱. 1만 × 1만 = 1억으로 폭증합니다.
예시
SELECT d.day, p.product_id FROM days d CROSS JOIN products p;
성능 포인트
!결과 행 수가 곱으로 늘어나므로 1만 × 1만 = 1억. 의도치 않은 CROSS JOIN은 즉시 OOM/Temp 폭증으로 이어진다.