by Langs [Oracle Tuning] 셀프조인 SELF JOIN 튜닝 COUNT [2019.05.27 16:40:43]
VAL1 |
275210 |
275248 |
275327 |
275342 |
275378 |
275411 |
275557 |
275566 |
....
한 ROW의 값을 전체 ROW값과 비교하여
+ - 500 범위 안에 있는 해당하는 COUNT를 해주어야 하는 상황입니다.
EX)
COUNT | VAL1 | VAL2(셀프조인) | SEQ |
30 | 275210 | 275210 | 101 |
30 | 275248 | 275248 | 102 |
28 | 275327 | 275327 | 103 |
28 | 275342 | 275342 | 104 |
27 | 275378 | 275378 | 105 |
27 | 275411 | 275411 | 106 |
31 | 275557 | 275557 | 107 |
32(최종 결과) | 275566 | 275566 | 108 |
SELECT MAX(CNT)
FROM(
SELECT COUNT(*) CNT, SOURCE.VAL1, SOURCE.SEQ
FROM RESULTDATA SOURCE, RESULTDATA TARGET
WHERE 1=1
AND SOURCE.VAL1 IS NOT NULL
AND SOURCE.VAL1 >= TARGET.VAL1-500
AND SOURCE.VAL1 <= TARGET.VAL1+500
GROUP BY SOURCE.VAL1,SOURCE.SEQ
);
위 쿼리와 같이 SELF JOIN을 하여 범위안 DATA를 COUNT를 하였는데
ROW수가 적을경우는 비교횟수가 적어 결과가 바로 나오지만
ROW가 많아 질수록 점점 느려집니다.. (전체 비교를 해야하니 비교 횟수가 점점증가..)
* 현재 운영시스템 기준 수행시간
-. 1000 ROW : 1초이내
-. 5500 ROW : 16초
-. 20000 ROW : 3분 38초
연산시 + - 500 범위 외 데이터를 제외시키면 될것 같은데 아무리 생각해봐도 방법이 떠오르지 않네요..ㅠㅠ
위와 같은 상황에서의 좋은 해결책 조언 부탁드리겠습니다.