오라클이고 조회 테이블은 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
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((창고코드, 자재유형, 특별재고, 사원번호, 출고자)) ;
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 추가하여도 느리다면 결국 인덱스 확인하는게 최선이겠지요?