쿼리 속도 향상 0 15 1,213

by 인턴 [Oracle 기초] [2018.03.19 17:50:43]


안녕하세요. 현재 작은 프로젝트에서 '오즈리포트' 툴을 이용하여 웹에서 보고서를 띄우는 작업을 하고있습니다.
문제는 오즈리포트를 생성할 때 DB로부터 데이터를 가져오는데 각 쿼리를 수행할 때 비동기적으로 가져올 수 없습니다. 따라서 쿼리문 하나를 실행하고 끝나면
다음 쿼리를 실행하는 식이죠.. 밑의 쿼리는 1.xxx 초 걸리는데 이러한 쿼리가 10개정도 있어, 결과적으로 보고서를 출력하는데 20~30초대가 걸립니다. 따라서 
쿼리가 실행되는데 밀리세컨 단위로 끊어야될거 같은데 혹시 실행속도를 향상시킬 수 있는 팁이 있을까요? 참고로 TB_REN016_006 이라는 테이블의 데이터는 
90만개입니다. 

SELECT MAX(CODE_VAL) 상태, 
       COUNT(EVENT_GRD_CODE_NO) 계 
  FROM TB_REN016_006 EVNT, 
       (SELECT CODE_NO, 
              CODE_VAL 
         FROM TB_REN016_012 
        WHERE CODE_NO IN(7002,7004,7006,7007) 
       ) CODE 
 WHERE EVNT.EVENT_GRD_CODE_NO(+) = CODE.CODE_NO 
       AND OCUR_DTM(+) BETWEEN TO_DATE('20180301','YYYYMMDD') AND TO_DATE('20180301','YYYYMMDD')+0.99999 
 GROUP BY CODE_NO 

 

by 우리집아찌 [2018.03.19 18:11:50]

틀린쿼리가 10개 인가요?

위의 쿼리랑 비슷하것이 10개인가요?

10개를 하나로 만들수있는지 부터 살펴보세요.


by 우리집아찌 [2018.03.19 18:15:48]
SELECT A.CODE_VAL
     , A.CNT
  FROM TB_REN016_012 A
     , (SELECT CODE
             , COUNT(*) AS CNT
         FROM TB_REN016_006
        WHERE OCUR_DTM BETWEEN TO_DATE('20180301','YYYYMMDD') AND TO_DATE('20180301','YYYYMMDD')+0.99999 
          AND CODE_NO IN (7002,7004,7006,7007)  
        GROUP BY CODE ) B
 WHERE A.CODE = B.CODE

 


by 인턴 [2018.03.20 09:25:01]

비슷한 것이 10개입니다..!

올려주신 쿼리는 서브쿼리에서 조회되는 테이블의 순서를 바꾼것인가요..?


by 우리집아찌 [2018.03.20 09:37:15]

위의 쿼리를 효율적으로 바꿔본것입니다.

TB_REN016_006 테이블에 OCUR_DTM , CODE_NO 에 INDEX가 있어야 효율적이겠지만요.


by 마농 [2018.03.19 18:18:12]

각 쿼리별로 적절한 인덱스가 있어야 합니다.
컬럼 타입에 맞게 조건값을 입력했는지도 확인해야 합니다.
예) 문자 컬럼에 숫자 조건을 주지는 않았는지?


by 인턴 [2018.03.20 09:26:12]

수동 인덱스를 따로 만들어두고 사용하라는 말씀이신가요?


by 우리집아찌 [2018.03.20 09:37:43]

수동 인덱스란 없습니다.

위의 쿼리에 사용하는 해당 테이블의 인덱스를 올려주세요.


by 인턴 [2018.03.20 09:57:39]

 

 

 

REN016_006 테이블의 인덱스                        REN016_012 테이블의 인덱스

이름 : PK_REN016_006                                 PK_REN016_012

컬럼 : MEAIN_EVENT_SERI_NO                      CODE_NO 

위치 : 1                                                    1

길이 : 22                                                  22

테이블명 : TB_REN016_006                           TB_REN016_012

테이블소유자 : SWMS                                 SWMS

 

쿼리에서 사용되는 2개의 테이블에 대한 인덱스입니다!

 

 


by 우리집아찌 [2018.03.20 10:07:49]

REN016_006 에 CODE_NO  인덱스 추가 요청하세요. 

 


by 인턴 [2018.03.20 10:18:49]

REN016_006 테이블에는 CODE_NO 이라는 컬럼이 없습니다만.. 추가가 되는건가요?


by 마농 [2018.03.20 10:07:13]
CREATE INDEX x01_tb_ren016_006 ON tb_ren016_006(event_grd_code_no, ocur_dtm);

 


by 인턴 [2018.03.20 10:16:33]

감사합니다! 그런식으로 컬럼을 추가해서 인덱스를 만들면 SELECT를 할 때 자동적으로 인덱스가 반영이되는건가요?

아니면 인덱스를 사용하는 쿼리문이 있나요? 


by 마농 [2018.03.20 10:25:37]

code_no 컬럼을 추가해서 인덱스를 만드는게 아니고
event_grd_code_no 컬럼으로 인덱스를 만들면 됩니다.
적절한 인덱스가 있다면? 자동으로 사용됩니다.


by 인턴 [2018.03.20 10:32:57]

감사합니다! 쿼리 실행속도가 확실히 빨라졌고, 웹에서 보고서 로딩시간도 많이 줄었습니다.


by 우리집아찌 [2018.03.20 12:08:49]

제가 잘못봤네요. EVENT_GRD_CODE_NO 이네요

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