안녕하세요. 현재 작은 프로젝트에서 '오즈리포트' 툴을 이용하여 웹에서 보고서를 띄우는 작업을 하고있습니다.
문제는 오즈리포트를 생성할 때 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
틀린쿼리가 10개 인가요?
위의 쿼리랑 비슷하것이 10개인가요?
10개를 하나로 만들수있는지 부터 살펴보세요.
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
위의 쿼리를 효율적으로 바꿔본것입니다.
TB_REN016_006 테이블에 OCUR_DTM , CODE_NO 에 INDEX가 있어야 효율적이겠지만요.
비슷한 것이 10개입니다..!
올려주신 쿼리는 서브쿼리에서 조회되는 테이블의 순서를 바꾼것인가요..?
각 쿼리별로 적절한 인덱스가 있어야 합니다.
컬럼 타입에 맞게 조건값을 입력했는지도 확인해야 합니다.
예) 문자 컬럼에 숫자 조건을 주지는 않았는지?
수동 인덱스란 없습니다.
위의 쿼리에 사용하는 해당 테이블의 인덱스를 올려주세요.
수동 인덱스를 따로 만들어두고 사용하라는 말씀이신가요?
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개의 테이블에 대한 인덱스입니다!
REN016_006 테이블에는 CODE_NO 이라는 컬럼이 없습니다만.. 추가가 되는건가요?
REN016_006 에 CODE_NO 인덱스 추가 요청하세요.
CREATE INDEX x01_tb_ren016_006 ON tb_ren016_006(event_grd_code_no, ocur_dtm);
감사합니다! 그런식으로 컬럼을 추가해서 인덱스를 만들면 SELECT를 할 때 자동적으로 인덱스가 반영이되는건가요?
아니면 인덱스를 사용하는 쿼리문이 있나요?
code_no 컬럼을 추가해서 인덱스를 만드는게 아니고
event_grd_code_no 컬럼으로 인덱스를 만들면 됩니다.
적절한 인덱스가 있다면? 자동으로 사용됩니다.
감사합니다! 쿼리 실행속도가 확실히 빨라졌고, 웹에서 보고서 로딩시간도 많이 줄었습니다.
제가 잘못봤네요. EVENT_GRD_CODE_NO 이네요