패이징 처리 , ROWNUM 속도 0 3 6,232

by 손님 [SQL Query] ROWNUM [2011.07.25 13:52:26]


안녕하세요.. ROWNUM관련해서 질문드립니다..

MEASURE테이블의 데이터가 300만건정도구요..
EQUIP테이블의 데이터는 3000개입니다.

MEASURE테이블의 PK = REGDATE (DATE이고 나머지는 모두VARCHAR2(20))
      FK= EQUIPCAT,EQUIPID
EQUIP테이블의       PK =  EQUIPID,
                              FK= EQUIPCAT


쿼리..
 SELECT D.NUM
 FROM(  
     SELECT ROWNUM NUM,T1.*,T2.*
     FROM (SELECT /*+INDEX_DESC(MEASURE,XPK_REGDATE)*/* FROM MEASURE WHERE EQUIPCAT NOT IN ('PARK001','YEBO001') AND REGDATE BETWEEN TO_DATE('07/01/2011','MM/DD/YYYY') AND TO_DATE('07/25/2011','MM/DD/YYYY')+1) T1 
     JOIN (SELECT /*+INDEX(EQUIP,XPK_EQUIP)*/* FROM EQUIP WHERE EQUIPCAT NOT IN ('PARK001','YEBO001') )T2  
     ON T1.EQUIPCAT=T2.EQUIPCAT  
     AND T1.EQUIPID=T2.EQUIPID  
 )D
 WHERE NUM >= 6894 AND NUM<=7014

내부 파란색 쿼리만 실행하면 0.1초만에 300만건이 조회가 됩니다.
패이징 처리할려고 NUM 간격을 조건으로 지정하면 10초정도가 걸리네요.;;
시간을 단축시킬 방법이 없을까요?

 
by 손님 [2011.07.25 14:00:35]
참고..쿼리가 T1.*,T2.* ,NUM 에서 D.NUM만 조회하는게아니라..간략하게 보여드릴려고 생략하였습니다..

by 마농 [2011.07.25 14:13:01]
0.1 초만에 300만건이 나온건 아닐거구요.
0.1초만에 눈에 보이는만큼만 보여주고
나머지 부분은 대기중이거나 물밑작업중 일것입니다.
응답시간(눈에 보여지기 시작하는 시간) 과
처리시간(최종결과가 모두 다 보여지는 시간) 의 차이죠.

조인 후 페이징 처리를 하지 마시고
페이징 처리 후 조인하세요.

SELECT *
FROM
(
SELECT /*+ INDEX_DESC(t xpk_regdate) */
ROWNUM num, t.*
FROM measure t
WHERE equipcat NOT IN ('PARK001','YEBO001')
-- 데이터의 정밀도 를 높이기 위해 날짜 조건 변경
-- 기존 between 조건의 경우 26일 0시0분0초의 자료가 포함됨
AND regdate >= TO_DATE('07/01/2011','mm/dd/yyyy')
AND regdate < TO_DATE('07/25/2011','mm/dd/yyyy') + 1
-- 1차적으로 rownum으로 한번 걸러주고
AND ROWNUM <= 7014
) t1
, equip t2
WHERE t1.num >= 6894
AND t1.num <= 7014
AND t1.equipcat = t2.equipcat
AND t1.equipid = t2.equipid
;

by 손니 [2011.07.25 14:27:39]
답변 감사합니다.ㅎㅎ
수정해보도록 하겠습니다.
댓글등록
SQL문을 포맷에 맞게(깔끔하게) 등록하려면 code() 버튼을 클릭하여 작성 하시면 됩니다.
로그인 사용자만 댓글을 작성 할 수 있습니다. 로그인, 회원가입