DB_LINK GROUP BY 쿼리 속도 문제 1 4 1,117

by 실베 [SQL Query] [2021.11.12 12:43:10]


오라클이고 조회 테이블은  db link 테이블 입니다.
쿼리 속도가 너무 느린데 이유를 모르겠습니다.
우선 테이블에 데이터가 2만건 가량있고 인라인뷰에서 
AND 출고일 BETWEEN TO_DATE('2021-09-01','YYYY-MM-DD') AND TO_DATE('2021-09-30'||'235959','YYYY-MM-DDHH24MISS')
조건문으로 인해 쿼리가 2건만 조회되어 바로 조회가 됩니다.
그런데 이것을 다시 group by rollup 처리를 하는데 갑자기 쿼리 속도가 10초이상 걸리네요.
(인라인 뷰에서 2건 나온걸로 처리하는게 아니라 테이블을 다시 전체 조회하는 느낌..)

플랜을 보려고해도 REMOTE 라서 플랜은 확인이 불가능 합니다..

무엇이 문제일까요? ​​​

SELECT ROWNUM,
         DECODE(ROWNUM,NULL,'',MAX(LGORT))        AS LGORT, 
         SUM(ZGI_CNT)      AS ZGI_CNT,
         SUM(ZGI_CNT_SU)   AS ZGI_CNT_SU,
         SUM(ZGI_AMT)      AS ZGI_AMT,
         DECODE(ROWNUM,NULL,'',MAX(CHARG))         AS CHARG,
         DECODE(ROWNUM,NULL,'',MAX(SOBKZ))         AS SOBKZ,
         WERKS,
         DECODE(ROWNUM,NULL,'',MAX(ZREF_ID))      AS ZREF_ID,
         DECODE(GROUPING(ROWNUM),1,'합계',MAX(ZREF_NM)) AS ZREF_NM,
         SUM(ZGI_SCNT)       AS ZGI_SCNT,
         SUM(ZGI_SCNT_SU)  AS ZGI_SCNT_SU,
         SUM(ZGI_SAMT)     AS ZGI_SAMT,
         round(decode(SUM(ZGI_CNT),0,0,null,0,'',0,SUM(ZGI_SCNT)/SUM(ZGI_CNT)*100),2)  AS SUMR  , 
         round(decode(SUM(ZGI_AMT),0,0,null,0,'',0,SUM(ZGI_SAMT)/SUM(ZGI_AMT)*100),2)  AS SUMA  ,
         GROUPING(WERKS)   AS GUBUN
  FROM (SELECT 창고코드      AS LGORT   
          , SUM(출고건수)      AS ZGI_CNT 
          , SUM(출고수량)*-1      AS ZGI_CNT_SU 
          , rtrim(to_char(SUM(출고금액)*-1,'999999990.9'))      AS ZGI_AMT 
          , SUM(설비관리출고건수)  AS ZGI_ICNT
          , SUM(설비관리출고수량)*-1  AS ZGI_ICNT_SU
          , SUM(설비관리출고금액)*-1  AS ZGI_IAMT
          , 자재유형      AS CHARG   
          , 특별재고      AS SOBKZ   
          , DECODE(플랜트코드,'2000','2000 121','3000','3000 1212','4000','4000 1212','6000','6000 1212')    AS WERKS   
          , 사원번호      AS ZREF_ID   
          , 출고자      AS ZREF_NM   
          , SUM(ERP출고건수)    AS ZGI_SCNT   
          , SUM(ERP출고수량)*-1    AS ZGI_SCNT_SU   
          , SUM(ERP출고금액)*-1    AS ZGI_SAMT   
    from Table@리모트

    where 1=1

    AND 출고일 BETWEEN TO_DATE('2021-09-01','YYYY-MM-DD') AND TO_DATE('2021-09-30'||'235959','YYYY-MM-DDHH24MISS')

    AND     플랜트코드 = '4000'

    GROUP BY 창고코드,자재유형,특별재고,플랜트코드,사원번호,출고자
    ORDER BY 플랜트코드 
        )
    group by rollup(WERKS,ROWNUM)
    HAVING GROUPING(WERKS) != 1 
    ORDER BY WERKS

 

by 마농 [2021.11.12 13:10:49]

1. 적절한 인덱스는 존재하나요? (플랜트코드, 출고일)
2. 롤업의 정확한 사용법을 몰라서 쿼리가 복잡해 졌네요.
- 롤업의 괄호 사용법을 익혀 보세요.
3. RTRIM(TO_CHAR 함수의 사용이 애매합니다.
- 의도와 다르게 잘못 사용이 된 것 같습니다.
- 정확한 의도를 알려주세요.
 

SELECT /*+ DRIVING_SITE(a) */
       창고코드                                 AS lgort
     , SUM(출고건수)                            AS zgi_cnt
     , SUM(출고수량)*-1                         AS zgi_cnt_su
     , TO_CHAR(SUM(출고금액)*-1, '999999990.0') AS zgi_amt
     , SUM(설비관리출고건수)                    AS zgi_icnt
     , SUM(설비관리출고수량)                    AS zgi_icnt_su
     , SUM(설비관리출고금액)*-1                 AS zgi_iamt
     , 자재유형                                 AS charg
     , 특별재고                                 AS sobkz
     , DECODE(플랜트코드, '2000', '2000 121'
                        , '3000', '3000 1212'
                        , '4000', '4000 1212'
                        , '6000', '6000 1212'
                        )                       AS werks
     , 사원번호                                 AS zref_id
     , NVL(출고자, '합계')                      AS zref_nm
     , SUM(ERP출고건수)                         AS zgi_scnt
     , SUM(ERP출고수량)*-1                      AS zgi_scnt_su
     , SUM(ERP출고금액)*-1                      AS zgi_samt
     , ROUND(SUM(ERP출고건수) / NULLIF(SUM(출고건수), 0) * 100, 2) AS sumr
     , ROUND(SUM(ERP출고금액) / NULLIF(SUM(출고금액), 0) * 100, 2) AS suma
  FROM table@dblink_nm a
 WHERE 1=1
   AND 출고일 BETWEEN TO_DATE('2021-09-01', 'yyyy-mm-dd')
                  AND TO_DATE('2021-09-30'||'235959', 'yyyy-mm-ddhh24miss')
   AND 플랜트코드 = '4000'
 GROUP BY 플랜트코드, ROLLUP((창고코드, 자재유형, 특별재고, 사원번호, 출고자))
;

 


by 실베 [2021.11.12 13:18:38]

답변 감사합니다.

우선 알려주신 쿼리로도 속도는 문제가 있네요.

인덱스는 확인을 해봐야하는데 타 회사 관리 테이블이다보니...

 


by 마농 [2021.11.12 13:25:58]

DRIVING_SITE 힌트 추가해 보세요.


by 실베 [2021.11.12 13:30:38]
SELECT /*+ DRIVING_SITE (d) */창고코드                                 AS lgort
     , SUM(출고건수)                            AS zgi_cnt
     , SUM(출고수량)*-1                         AS zgi_cnt_su
     , TO_CHAR(SUM(출고금액)*-1, '999999990.0') AS zgi_amt
     , SUM(설비관리출고건수)                    AS zgi_icnt
     , SUM(설비관리출고수량)                    AS zgi_icnt_su
     , SUM(설비관리출고금액)*-1                 AS zgi_iamt
     , 자재유형                                 AS charg
     , 특별재고                                 AS sobkz
     , DECODE(플랜트코드, '2000', '2000 121'
                        , '3000', '3000 1212'
                        , '4000', '4000 1212'
                        , '6000', '6000 1212'
                        )                       AS werks
     , 사원번호                                 AS zref_id
     , NVL(출고자, '합계')                      AS zref_nm
     , SUM(ERP출고건수)                         AS zgi_scnt
     , SUM(ERP출고수량)*-1                      AS zgi_scnt_su
     , SUM(ERP출고금액)*-1                      AS zgi_samt
  FROM table@dblink_nm d
 WHERE 1=1
   AND 출고일 BETWEEN TO_DATE('2021-09-01', 'yyyy-mm-dd')
                  AND TO_DATE('2021-09-30'||'235959', 'yyyy-mm-ddhh24miss')
   AND 플랜트코드 = '4000'
 GROUP BY 플랜트코드, ROLLUP((창고코드, 자재유형, 특별재고, 사원번호, 출고자))

 

 

driving_site 추가하여도 느리다면 결국 인덱스 확인하는게 최선이겠지요?

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