핵심 요약
Cartesian Product는 두 집합의 모든 가능한 조합을 만드는 연산이며, SQL에서 여러 1:N 관계를 동시에 JOIN할 경우 자식 Row끼리 조합되면서 결과 Row 수가 곱셈 형태로 증가하는 원인이 될 수 있다.
아래와 같은 2개의 집합이 있다고 가정한다.
A = {1, 2}
B = {a, b, c}카테시안 곱 수행시 다음과 같은 결과가 나온다.
A × B
(1, a)
(1, b)
(1, c)
(2, a)
(2, b)
(2, c)INFO
카티션 프로덕트는 조건 없이 모든 조합을 만들기 때문에, 결과의 튜플 수는 R의 튜플 수 × S의 튜플 수가 됩니다. 합병 가능 조건이 필요한 합집합·교집합·차집합과 달리, 카티션 프로덕트는 속성이 달라도 사용할 수 있습니다.
SQL로 보는 카테시안 곱
일반적인 SQL에서 다음과 같은 연산으로 카테시안 곱을 수행한다.
SELECT * FROM member, board아래는 PostgreSQL를 기준으로 아래 연산 모두 카테시안 곱을 수행한다.
SELECT * FROM member CROSS JOIN board;
SELECT * FROM FROM member INNER JOIN board ON TRUE카테시안 곱의 문제점
여러 개의 1:N 관계를 한 번의 쿼리로 조인하면 각 자식 데이터의 조합만큼 결과 행이 증가할 수 있다.
예를 들어 하나의 게시물에 리뷰가 100개 있다면 게시물과 리뷰를 조인했을 때 100개의 행이 생성된다.
여기에 각 리뷰와 별개로 게시물에 연결된 또 다른 1:N 관계의 데이터가 N개 존재하고 이를 함께 조인한다면 결과 행은 다음과 같이 증가할 수 있다.
1 × 100 × N
N = 5 → 500 rows
N = 100 → 10,000 rows
즉, 여러 1:N 관계를 동시에 조인할수록 결과 행이 곱셈 형태로 증가하며, 동일한 상위 데이터가 반복되어 전송된다.
이는 불필요한 데이터 조회와 네트워크 전송량 증가, DB 및 애플리케이션의 처리 비용 증가로 이어질 수 있다.