h1.03데이터 모델 측면에서의 검토

h3.사례1
-- 마이그레이션시 발생한 예외 케이스로 M:M관계로 빠진 경우

h5.1.현재 SORT로 문제가 되고 있는 쿼리 확인



select a.상품id, a.과금액, b.수납액, b.수납일시
from (select 고객id, 상품id, 과금연월, sum(과금액) 과금액
      from 과금
      where 과금연월 = :과금연월
      and 고객id = :고객id
      group by 고객id, 상품id, 과금연월) a
      , 수납 b
where b.고객id(+) = a.고객id
and   b.상품id(+) = a.상품id
and   b.과금연월(+) = a.과금연월
order by a.상품id, b.순번     

h5.2.현재 상태의 모델 확인

h5.3.현재 상태의 모델 확인 - 상세

h5.4.클렌징 작업 - 과금테이블의 순번을 합산저장하여 순번을 없앰.

h5.5.정상적인 상태의 초기 모델 구현

h5.6.초기모델 구현후 실행 쿼리 확인 (group by를 사용하지 않음)



select a.상품id, a.과금액, b.수납액, b.수납일시
from 과금 a, 수납 b
where a.과금연월 = :과금연월
and a.고객id =:고객id
and b.고객id(+) = a.고객id
and b.상품id(+) = a.상품id
and b.과금연월(+) = a.과금연월
order by a.상품id, b.순번;


h3.사례2
-- 반정규화를 통한 최적화를 잘못한 경우 (반정규화는 어플리케이션을 고려하여야함)

h5.1.현재 sort작업이 과도하여 문제를 유발하는 쿼리



select 과금.고객id, 과금.상품id, 과금.과금액, 가입상품.가입일시
from 과금,
     (select 고객id, 상품id, min(가입일시) 가입일시
      from 고객별상품라인
      group by 고객id, 상품id) 가입상품
where 과금.고객id(+) = 가입상품.고객id
and   과금.상품id(+) = 가입상품.상품id
and   과금.과금연월(+) = :yyyymm ;


h5.2.테이블 갯수를 줄이기 위하여 자식테이블에 통합.(반정규화)

h5.3.정규화된 데이터 모델.(테이블 갯수는 늘었지만 sort작업을 줄일수 있음)

h5.4.올바른 모델링시 조회쿼리



select 과금.고객 id, 과금.상품id, 과금.과금액, 가입상품.가입일시
from  과금, 가입상품
where 과금.고객id(+) = 가입상품.고객id
and   과금.상품id(+) = 가입상품.상품id
and   과금.과금연월(+) = :yyyymm ;


h3.사례3
-- 순번을 사용하여 이력을 적재하는 테이블의 집합이력 조회시 문제

h5.1.현재 sort작업이 과도하여 문제를 유발하는 쿼리



SELECT ......
FROM   (
   SELECT ......
   FROM   소송심급피해대상 A,
          소송대상청구     B,
          소송심급         C,
          소송             D,
          소송결재         E,
          민원마스터       F,
          VOC유형코드      G,
          (SELECT ......
           FROM   (SELECT ......,
                          RANK() OVER(PARTITION BY ...... ORDER BY 종결년도 DESC, 종결순번 DESC) RANK
                   FROM   소송심급대상종결 A)
           WHERE   RANK = 1) H,
          (SELECT ......
           FROM   (SELECT ......,
                          RANK() OVER(PARTITION BY ...... ORDER BY 마감일자 DESC) RANK
                   FROM   피해청구 A)
           WHERE   RANK = 1) I,
          (SELECT ......
           FROM   (SELECT ......,
                          RANK() OVER(PARTITION BY ...... ORDER BY A.판결년도 DESC, A.순번 DESC) RANK
                   FROM   판결         A,
                          소송피해내용 B,
                          소송금       C,
                          소승소득내용 D,
                         (SELECT ......
                          FROM   (SELECT ......,
                                         RANK() OVER(PARTITION BY ...... ORDER BY 순번 DESC) RANK
                                  FROM   소송결재
                                  WHERE  ......)
                          WHERE  RANK = 1) E
                   WHERE  A.판결년도 = B.판결년도
                     AND  A.판결순번 = B.판결순번
                     AND    ......)
            WHERE   RANK = 1) J,
           (SELECT ......
            FROM   (SELECT ......,
                           RANK() OVER(PARTITION BY ...... ORDER BY A.특인차수 DESC, B.순번 DESC) RANK
                    FROM   특인     A, 
                           특인결재 B
                        WHERE  A.특인년도 = B.특인년도
                        AND    A.특인순번 = B.특인순번
                        AND    ......)
            WHERE   RANK = 1) K,
           (SELECT ......
            FROM   (SELECT ......,
                           RANK() OVER(PARTITION BY ...... ORDER BY A.소송심급피해대상순번 DESC) RANK
                    FROM   소송대상청구     A,
                           소송심급피해대상 B,
                           소송심급         C,
                           소송             D
                    WHERE  ......)
            WHERE   RANK = 1) L
   WHERE  ......);


h5.2.소트가 일어나는 이유가 분석함수 사용으로 인하여 window sort로 확인.

h5.3.DML보다 월등히 많은 select작업이 들어오고 있음을 확인.

h5.4.분석한 데이터를 미리 넣어 놓을수 있는 플래그 컬럼을 추가하여 랭킹까지 미리 삽입해놓음.