by-nc-sa     개발자, DBA가 함께 만들어가는 구루비 지식창고!

3. 방사형 조인의 해결




3.1. 방사형 조인의 문제점

(문제) 10번부서의 사원별 3개월 급여합계 및 가족수를 구해보자
  • emp
    no nm dept
    11 마농 10
    22 구니 10
    33 다솜 10
  • fam
    no fam_no fam_nm
    11 1 마누라
    22 1 와이프
    22 2 아들
  • gub
    no ym sal
    11 200901 100
    11 200902 100
    11 200903 100
    22 200901 200
    22 200902 200
    22 200903 200
    33 200901 300
    33 200902 300
    33 200903 300
  • 최종결과
    no nm sal fam
    11 마농 300 1
    22 구니 600 2
    33 다솜 900 0
  • 단순 조인
SELECT e.no, e.nm, SUM(sal) sal, COUNT(f.no) fam
  FROM emp e, fam f, gub g
 WHERE e.no = f.no(+)
   AND e.no = g.no(+)
   AND e.dept = 10
   AND g.ym(+) BETWEEN '200901' AND '200903'
 GROUP BY e.no, e.nm
;
  • 결과
    no nm sal fam
    11 마농 300 3
    22 구니 1200 6
    33 다솜 900 0
  • (1 : M) 조인 과 (1 : N) 조인 각각은 문제가 없다.
  • 하지만 두 결과집합을 조인하게 되면 원치않는 데이터 복제가 발생된다.

3.2. 인라인뷰를 이용한 해결

  • M의 집합을 조인키로 그룹바이 한후 1 : 1 조인
SELECT e.no, e.nm, g.sal, f.fam
  FROM emp e
     , (SELECT no, COUNT(*) fam
          FROM fam
         GROUP BY no
        ) f
     , (SELECT no, SUM(sal) sal
          FROM gub
         WHERE ym BETWEEN '200901' AND '200903'
         GROUP BY no
        ) g
 WHERE e.no = f.no(+)
   AND e.no = g.no(+)
   AND e.dept = 10
;
  • 결과
    no nm sal fam
    11 마농 300 1
    22 구니 600 2
    33 다솜 900  
  • 결과 자료에는 아무런 문제가 없다
  • 하지만 처리 절차에 문제점이 있다.
  • 처리범위를 줄여주는 조건인 10번부서 조건이
    Group by 절 안으로 파고들 수 없다.
  • 가족과 급여는 전체 부서를 대상으로 Group by 후
    대다수의 사원정보가 버려지게 된다.

3.3. 스칼라 서브쿼리를 이용한 해결

  • 처리 대상을 줄인 후 Group by
SELECT e.no, e.nm
     , (SELECT SUM(sal)
          FROM gub
         WHERE ym BETWEEN '200901' AND '200903'
           AND no = e.no
        ) sal
     , (SELECT COUNT(*)
          FROM fam
         WHERE no = e.no
        ) fam
  FROM emp e
 WHERE e.dept = 10
;
  • 결과
    no nm sal fam
    11 마농 300 1
    22 구니 600 2
    33 다솜 900 0

About Doc.

  • 최초작성자 : 기민용
  • 최초작성일 : 2009년 5월 15일
  • 이 문서는 오라클클럽 대용량 데이터베이스 스터디 모임에서 작성하였습니다.
  • 이 문서의 내용은 이화식님의 대용량 데이터베이스 솔루션2를 참고했습니다.

문서정보

Enter labels to add to this page:
Please wait 
Looking for a label? Just start typing.