-
[Database] SQL 카테시안 곱: 원인, 증상, 재현 예시, 예방 체크리스트업무 자동화/Database 2025. 11. 13. 08:45

요약
정의 조인 조건 누락·오류로 인해 두 테이블의 모든 행이 곱셈처럼 결합되는 현상 대표 원인 JOIN … ON 누락, ON 1=1/항상 참 조건, 잘못된 키 매칭(타 컬럼) 전형 증상 결과 행 수가 A행수 × B행수로 폭증, 중복 로우·지표 왜곡 빠른 진단 EXPLAIN에서 CROSS JOIN/카티션 표기, 행 수 급증 여부, 카디널리티 비정상 안전 대책 명시적 조인 키, PK/FK 제약, 스키마·인덱스 점검, 테스트 쿼리로 행 수 확인 1. 개념
- 정의: 조인 대상 테이블 사이에 유효한 조인 조건 부재 또는 항상 참이 되는 조건 사용으로, 두 테이블의 모든 행이 서로 결합되는 현상.
- 영향: 결과 행 수 폭증, 중복 합산에 따른 리포트/집계 왜곡, 불필요한 I/O와 비용 증가.
2. 최소 재현 예시
2-1. 샘플 테이블
-- 회사(3행), 공장(3행) 가정
CREATE TABLE comp (
comp_id VARCHAR(10) PRIMARY KEY,
comp_nm VARCHAR(200),
comp_addr VARCHAR(300)
);
CREATE TABLE factory (
comp_id VARCHAR(10) NOT NULL,
facto_id VARCHAR(10) NOT NULL,
facto_nm VARCHAR(200),
facto_addr VARCHAR(300),
PRIMARY KEY (comp_id, facto_id)
);2-2. 잘못된 조인(조건 누락 또는 1=1)
-- 3 x 3 = 9행 산출(카테시안 곱)
SELECT *
FROM comp A
JOIN factory B -- ON 절 누락!
-- 또는: ON 1=1
;- 증상: 행 수가 |comp| × |factory|로 증가. 원문 예시도 동일 현상 시연
2-3. 올바른 조인
-- 회사-공장 1:N 관계 가정
SELECT *
FROM comp A
JOIN factory B
ON A.comp_id = B.comp_id;3. 실무에서 자주 보이는 원인 패턴
패턴설명위험도JOIN … 후 ON 누락 구문은 통과, 실행 시 전행 결합 매우 높음 ON 1=1 / ON TRUE 디버깅 중 임시 조건이 상시 참으로 고정 매우 높음 잘못된 컬럼 매칭 A.user_id = B.order_id처럼 다른 키로 매칭 높음 조인 방향 혼동 드리븐 테이블·선택성 고려 없이 무분별 조인 중간 WHERE로 나중 필터 ON 대신 WHERE에 키 조건 배치 누락 중간 4. 빠른 진단 절차
4-1. 행 수 급증 확인
-- 기대 값과 비교: 실제 조인 결과가 단순 곱셈에 근접하면 의심
SELECT COUNT(*) FROM comp; -- 예: 3
SELECT COUNT(*) FROM factory; -- 예: 3
SELECT COUNT(*) FROM comp JOIN factory; -- 예: 9 → 의심4-2. 실행 계획 확인
- EXPLAIN에서 CROSS JOIN, Cartesian 표기 또는 조인 조건 없음 표시 확인.
- 카디널리티가 입력 행수 곱에 근접하면 의심.
4-3. 데이터 중복 신호
- GROUP BY나 DISTINCT 없이 합계·건수 지표가 비정상적으로 커짐.
5. DBMS별 표현과 주의
DBMS위험 구문 예시안전 구문 팁PostgreSQL FROM a JOIN b; (ON 누락 시 카티션) JOIN … ON 키 명시, EXPLAIN (ANALYZE, BUFFERS)로 확인 MySQL 8+ JOIN 뒤 조건 누락, ON 1=1 EXPLAIN FORMAT=JSON, 조인 순서·인덱스 점검 Oracle ,(구문 조인) + WHERE 조건 누락 ANSI 조인(JOIN … ON) 일원화 권장 BigQuery CROSS JOIN 또는 JOIN 조건 누락 비용 급증 주의, 쿼리 요금 예측 확인 SQL Server FROM a, b + 조건 누락 SET SHOWPLAN_XML ON으로 계획 점검 6. 예방 체크리스트
- 조인 키 명시화: 모든 JOIN에 ON A.pk = B.fk 형태 강제
- 제약 활용: PK/FK 선언 및 인덱스 설계로 스키마 차원 보호
- 코드 리뷰 룰: JOIN 뒤 ON 필수 룰, ON 1=1 금지 규칙화
- 테스트 쿼리: 조인 전·후 행 수 비교 스니펫 상시 사용
- 실행 계획 습관화: EXPLAIN로 카티션·카디널리티 확인
- 샘플 데이터셋: 경계 케이스(0행, 1행, 다행) 포함 검증
- ANSI 조인 통일: 구문 혼용(쉼표 조인 + WHERE) 지양
'업무 자동화 > Database' 카테고리의 다른 글
[Database] SQL 서브쿼리(Subquery) 정리: 개념, 위치별 활용 (0) 2025.11.15 [Database] SQL JOIN 총정리: INNER/OUTER/SEMI/ANTI/CROSS, NATURAL/USING, UNION (0) 2025.11.14 [Database] SQL의 정규표현식: 정의, 핵심 패턴 표, DBMS별 사용법, 이메일·전화번호·주소 예시 (0) 2025.11.12 [Database] SQL Window 함수 개념과 사용 예시 (0) 2025.11.11 [Database] 반정규화(Denormalization)의 개념과 적용 (0) 2025.11.10