대용량 데이터베이스솔루션 2 (2009년)
방사형 조인의 해결 0 0 5,674

by 구루비 방사형 조인 [2009.05.15]


3.1. 방사형 조인의 문제점

(문제) 10번부서의 사원별 3개월 급여합계 및 가족수를 구해보자

{section}
{column}

  • emp
nonmdept
11마농10
22구니10
33다솜10

{column}
{column}

  • fam
nofam_nofam_nm
111마누라
221와이프
222아들

{column}
{column}

  • gub
noymsal
11200901100
11200902100
11200903100
22200901200
22200902200
22200903200
33200901300
33200902300
33200903300

{column}
{column}

  • 최종결과
nonmsalfam
11마농3001
22구니6002
33다솜9000

{column}
{column:width=40%}
{column}
{section}

{section}
{column}

  • 단순 조인

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
;

{column}
{column}

  • 결과
nonmsalfam
11마농3003
22구니12006
33다솜9000

{column}
{column:width=45%}
{column}
{section}

  • (1 : M) 조인 과 (1 : N) 조인 각각은 문제가 없다.
  • 하지만 두 결과집합을 조인하게 되면 원치않는 데이터 복제가 발생된다.

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

{section}
{column}

  • 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
;

{column}
{column}

  • 결과
nonmsalfam
11마농3001
22구니6002
33다솜900

{column}
{column:width=45%}
{column}
{section}

  • 결과 자료에는 아무런 문제가 없다
  • 하지만 처리 절차에 문제점이 있다.
  • 처리범위를 줄여주는 조건인 10번부서 조건이
    Group by 절 안으로 파고들 수 없다.
  • 가족과 급여는 전체 부서를 대상으로 Group by 후
    대다수의 사원정보가 버려지게 된다.

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

{section}
{column}

  • 처리 대상을 줄인 후 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
;

{column}
{column}

  • 결과
nonmsalfam
11마농3001
22구니6002
33다솜9000

{column}
{column:width=45%}
{column}
{section}

About Doc.

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

- 강좌 URL : http://www.gurubee.net/lecture/2539

- 구루비 강좌는 개인의 학습용으로만 사용 할 수 있으며, 다른 웹 페이지에 게재할 경우에는 출처를 꼭 밝혀 주시면 고맙겠습니다.~^^

- 구루비 강좌는 서비스 제공을 위한 목적이나, 학원 홍보, 수익을 얻기 위한 용도로 사용 할 수 없습니다.

댓글등록
SQL문을 포맷에 맞게(깔끔하게) 등록하려면 code() 버튼을 클릭하여 작성 하시면 됩니다.
로그인 사용자만 댓글을 작성 할 수 있습니다. 로그인, 회원가입