속도 고민중인데 조언 부탁드립니다. 0 5 526

by 빠곰 [Oracle 기초] [2018.06.27 14:37:12]


WITH T_HEADER AS
(
SELECT 'S20180601' 관리번호, '20180101' 처리일자, 50 발생금액, 50 처리금액 FROM DUAL
UNION ALL SELECT 'S20180602', '20180103', 36, 0 FROM DUAL
UNION ALL SELECT 'S20180603', '20180104', 51, 21 FROM DUAL
UNION ALL SELECT 'S20180604', '20180115', 36, 24 FROM DUAL
UNION ALL SELECT 'S20180605', '20180117',  5, 15 FROM DUAL
)
, T_DETAIL AS
(
SELECT 'S20180601' 관리번호, 1 순번, '20180109' 처리일자, 5 처리금액 FROM DUAL
UNION ALL SELECT 'S20180601', 2 , '20180110', 10 FROM DUAL
UNION ALL SELECT 'S20180601', 3 , '20180120', 10 FROM DUAL
UNION ALL SELECT 'S20180601', 4 , '20180125', 25 FROM DUAL
UNION ALL SELECT 'S20180603', 1 , '20180110', 21 FROM DUAL
UNION ALL SELECT 'S20180604', 1 , '20180120', 24 FROM DUAL
UNION ALL SELECT 'S20180605', 1 , '20180123', 15 FROM DUAL
)
SELECT H.관리번호 AS 관리번호
     , MAX(H.발생금액) AS 발생금액
     , SUM(NVL(D.처리금액,0)) AS 처리금액합계
     , MAX(H.발생금액) - SUM(NVL(D.처리금액,0)) AS 잔액
  FROM T_HEADER H
       LEFT OUTER JOIN (SELECT 관리번호, SUM(처리금액) 처리금액
                          FROM T_DETAIL
                         WHERE 처리일자 <= '20180115'
                         GROUP BY 관리번호) D
                  ON H.관리번호 = D.관리번호
 GROUP BY H.관리번호
 

관리번호 S20180601에 대해서 현재 처리완료가 되었는데 특정시점에 미처리된 정보를 조회하려고 합니다.

처리시 Header에 처리금액을 저장해둘 예정이라 최종자료를 기준으로 검색하면 Header만 검색하니 속도문제가 없을것 같은데

특정시점 20180115을 지정해서 검색하는 경우 Detail을 사용해서 최초자료부터 20180115까지 합계를 구해서 검색을 해봤습니다.

근데 시간이 지나서 5~10년치 자료를 검색하면 너무 느려질것 같아서 속도를 개선할 방법을 찾고 있는데 좋은 방법이 떠오르지 않습니다.

사소한것도 좋으니 조언부탁드립니다.

by 마농 [2018.06.27 15:13:07]
-- GROUP BY 는 필요 없습니다.
SELECT H.관리번호
     , H.발생금액
     , NVL(D.처리금액, 0) AS 처리금액합계
     , H.발생금액 - NVL(D.처리금액, 0) AS 잔액
  FROM T_HEADER H
  LEFT OUTER JOIN
       (SELECT 관리번호
             , SUM(처리금액) 처리금액
          FROM T_DETAIL
         WHERE 처리일자 <= '20180115'
         GROUP BY 관리번호
        ) D
    ON H.관리번호 = D.관리번호
;

 


by 빠곰 [2018.06.27 16:19:58]

하하하 ^^ 그룹은 필요없네요.

(SELECT 관리번호, SUM(처리금액) 처리금액 FROM T_DETAIL  WHERE 처리일자 <= '20180115'  GROUP BY 관리번호) D
요부분이 자료량이 많아지면 느려질것 같아서 고민중인데 다른 형태로 자료를 취합할 수는 없을까요?

 


by 마농 [2018.06.27 17:01:05]

전체 검색은 느릴수밖에 없죠.
검색조건을 주어 검색 범위를 줄이는 방법을 생각해 보세요.
특정 관리번호만 검색한다던가, 페이징 처리로 일부분만 조회한다던가


by 마농 [2018.06.27 17:10:38]


특정일 이전 처리된 정보 조회가 부담스럽다면?
특정일 이후 미처리된 정보 조회로 바꾸세요.
- 변경전 : h.발생금액 - d.처리금액(특정일 이전 처리금액 합계)
- 변경후 : h.발생금액 - h.처리금액 + d.미처리금액(특정일 이후 처리금액 합계)

SELECT H.관리번호
     , H.발생금액
     , NVL(D.처리금액, 0) AS 처리금액합계
--   , H.발생금액 - NVL(D.처리금액, 0) AS 잔액
     , H.발생금액 - H.처리금액 + NVL(D.처리금액, 0) AS 잔액
  FROM T_HEADER H
  LEFT OUTER JOIN
       (SELECT 관리번호
             , SUM(처리금액) 처리금액
          FROM T_DETAIL
--       WHERE 처리일자 <= '20180115'
         WHERE 처리일자 >  '20180115'
         GROUP BY 관리번호
        ) D
    ON H.관리번호 = D.관리번호
;

 


by 빠곰 [2018.06.27 17:32:36]
SELECT H.관리번호
     , H.발생금액
     , NVL(H.처리금액 - NVL(D.처리금액, 0), 0) AS 처리금액합계
     , H.발생금액 - H.처리금액 + NVL(D.처리금액, 0) AS 잔액
  FROM T_HEADER H
   LEFT OUTER JOIN
        (SELECT 관리번호
             , SUM(처리금액) 처리금액
          FROM T_DETAIL
          WHERE 처리일자 >  '20180115'
          GROUP BY 관리번호
        ) D
     ON H.관리번호 = D.관리번호

오호호 엄청납니다.
전체 자료를 조회하는 부담이 사라졌네요.
알려주신 개념으로 수정했더니 처리금액합계까지 원하는 형태로 잘 나오네요.
감사합니다.

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