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() 버튼을 클릭하여 작성 하시면 됩니다.