프로시져 속도 문제로 선배님들께 질문 드립니다. 0 3 871

by 7div [PL/SQL] [2016.05.18 14:32:59]


CREATE OR REPLACE PROCEDURE SIGMAWAY_DEV.SSM_USR_IF

IS


CURSOR LS_USR IS
        SELECT   USR1.EMPNO        AS V_EMPNO
         , USR1.EMP_HNAME    AS V_USERNM
               , CASE USR2.MAIL_ID when NULL THEN NULL
                 ELSE LOWER(USR2.MAIL_ID) || '@lscable.com'
                 END V_EMAIL
         , USR1.DEPT_CODE    AS V_DEPTCD
         , USR1.DUTY_CODE    AS V_DUTYCD
               ,CASE WHEN NVL(USR1.JIKNM_CODE, '') = '2300'
                          OR
                            NVL(USR1.JIKNM_CODE, '') = '2050'
                          OR
                            NVL(USR1.JIKNM_CODE, '') = '2040'
                          OR
                            NVL(USR1.JIKNM_CODE, '') = '3030'
                          OR
                            NVL(USR1.JIKNM_CODE, '') = '3040'
                          OR
                            NVL(USR1.JIKNM_CODE, '') = '3050'
                          THEN '2220'
                 ELSE NVL(USR1.JIKNM_CODE, '')
                 END  V_JIKGBCD
               , USR2.OFFICE_TEL   AS V_PHONENO
               , USR2.HAND_PHONE   AS V_HPNO
               , USR1.JIKMU_CODE   AS V_JIKMUCD
               , USR1.OFFICE_CODE  AS V_OFFICE_CODE
               , trim(USR1.COMPANY_CODE) AS V_COMPANY_CODE
          FROM TB_INA01@HRLSC.REGRESS.RDBMS.DEV.US.ORACLE.COM USR1  left outer join TB_INA02@HRLSC.REGRESS.RDBMS.DEV.US.ORACLE.COM USR2 on USR1.EMPNO = USR2.EMPNO
                                     inner join TB_INZ49@HRLSC.REGRESS.RDBMS.DEV.US.ORACLE.COM DEPT on USR1.DEPT_CODE  = DEPT.DEPT_CODE
         WHERE USR1.HT_CODE   IN ('1', '2')
           AND USR1.SAMU_CODE IN ('11', '12', '21', '31', '41', '46', '47', '51', '71', '81', '22', '23')
         UNION ALL
        SELECT  MUSR1.EMPNO        AS V_EMPNO
         , MUSR1.EMP_HNAME    AS V_USERNM
               , CASE MUSR2.MAIL_ID when NULL THEN NULL
                 ELSE LOWER(MUSR2.MAIL_ID) || '@lscable.com'
                 END V_EMAIL
         , MUSR1.DEPT_CODE    AS V_DEPTCD
         , MUSR1.DUTY_CODE    AS V_DUTYCD
               ,CASE WHEN NVL(MUSR1.JIKNM_CODE, '') = '2300'
                          OR
                            NVL(MUSR1.JIKNM_CODE, '') = '2050'
                          OR
                            NVL(MUSR1.JIKNM_CODE, '') = '2040'
                          OR
                            NVL(MUSR1.JIKNM_CODE, '') = '3030'
                          OR
                            NVL(MUSR1.JIKNM_CODE, '') = '3040'
                          OR
                            NVL(MUSR1.JIKNM_CODE, '') = '3050'
                          THEN '2220'
                 ELSE NVL(MUSR1.JIKNM_CODE, '')
                 END  V_JIKGBCD
               , MUSR2.OFFICE_TEL   AS V_PHONENO
               , MUSR2.HAND_PHONE   AS V_HPNO
               , MUSR1.JIKMU_CODE   AS V_JIKMUCD
               , MUSR1.OFFICE_CODE  AS V_OFFICE_CODE
               , trim(MUSR1.COMPANY_CODE) AS V_COMPANY_CODE
          FROM TB_INA01@HRLSM.REGRESS.RDBMS.DEV.US.ORACLE.COM MUSR1  left outer join TB_INA02@HRLSM.REGRESS.RDBMS.DEV.US.ORACLE.COM MUSR2 on MUSR1.EMPNO = MUSR2.EMPNO
                                     inner join TB_INZ49@HRLSM.REGRESS.RDBMS.DEV.US.ORACLE.COM MDEPT on MUSR1.DEPT_CODE  = MDEPT.DEPT_CODE
         WHERE MUSR1.HT_CODE   IN ('1', '2')
           AND MUSR1.SAMU_CODE IN ('11', '12', '21', '31', '41', '46', '47', '51', '71', '81', '22', '23');

BEGIN

DELETE FROM SSM_LS_USER;


FOR V_USR IN LS_USR
  LOOP
INSERT INTO SSM_LS_USER
              (
                 V_EMPNO
               , V_USERNM
               , V_DEPTCD
               , V_EMAIL
               , V_PHONENO
               , V_HPNO
               , V_DUTYCD
               , V_JIKGBCD
               , V_JIKMUCD
               , V_OFFICE_CODE
               , V_DIVISION_CODE
               , V_COMPANY_CODE
               , V_REG_USERID
               , V_REG_DTM
               , V_UPDATE_USERID
               , V_UPDATE_DTM
              )
       VALUES (
                 V_USR.V_EMPNO
               , V_USR.V_USERNM
               , V_USR.V_DEPTCD
               , V_USR.V_EMAIL
               , V_USR.V_PHONENO
               , V_USR.V_HPNO
               , V_USR.V_DUTYCD
               , V_USR.V_JIKGBCD
               , V_USR.V_JIKMUCD
               , V_USR.V_OFFICE_CODE
               , ''
               , V_USR.V_COMPANY_CODE
               , 'Procedure'
               , TO_CHAR(SYSDATE, 'yyyymmddhh24miss')
               , 'Procedure'
               , TO_CHAR(SYSDATE, 'yyyymmddhh24miss')
              );
    END LOOP;

 

  COMMIT;


END SSM_USR_IF;

 

이런 식으로 MSSQL에 들어 있는 데이터를 DB Link를 사용해서 커서에 넣었다가 오라클에 있는 테이블로 인서트 하는

프로시져를 작성하였습니다.

헌데 이 프로시져가 돌아가는데 20분이 넘게 걸려서 어떤 부분이 시간을 이렇게 오래 걸리게 하는 건지 궁금하여 선배님들께 질문 드립니다.

원인을 파악 할 수 없어서 조언 좀 부탁드리겠습니다. 감사합니다

by 마농 [2016.05.18 15:13:25]

불필요한 NVL 사용이나 복잡한 OR 사용이 눈에 거슬리긴 하지만...
  큰 의미는 없을 듯 하구요.
링크가 두개있는데 UNION ALL 로 합쳤네요.
  이게 영향이 있을런지는 모르겠으나...
  커서를 두개로 분리해서 두번 처리하는 방법도 괜찮을 듯 하구요.
기타 확인사항
  조인 키나 조건키에 대한 인덱스가 적절하게 존재하는지?
  실행계획에 이상은 없는지?
  실제 데이터 량이 어느정도 되는지?
데이터를 루프 돌려가며 건건이 입력하고 있는데...
  건건이 루프 돌리는 것은 좋은 방법은 아니죠.
  한방 쿼리 또는 Array Process 방식 검토해 보세요.


by 7div [2016.05.18 15:17:35]

답변 감사드립니다. 셀렉트 되는 데이터 량이 4000개 정도 밖에 되지 않아서 건건이 넣는 부분이 문제가 되지 않는다고 생각했는데 한방쿼리나 Araay Process 부분을 한번 검토해 보도록 하겠습니다


by 우리집아찌 [2016.05.18 19:41:04]

DB LINK 속도가 안나와서 일수도 있어요.

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