ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • [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) 지양
Designed by Tistory.