셀프조인 범위 연산하여 COUNT 하는 쿼리 튜닝 질문 0 4 2,746

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 범위 외 데이터를 제외시키면 될것 같은데 아무리 생각해봐도 방법이 떠오르지 않네요..ㅠㅠ

 

위와 같은 상황에서의 좋은 해결책 조언 부탁드리겠습니다.

by 랑에1 [2019.05.27 17:01:04]
COUNT(*) OVER (ORDER BY VAL1 RANGE BETWEEN 500 PRECEDING AND 500 FOLLOWING) AS CNT

셀프조인 하지마시고 가능한 버전이면 window 함수 써보시는게 좋을 것 같습니다.

 


by Langs [2019.05.28 09:51:18]

답변 감사합니다!! 생각하지 못했던 좋은 방법 배워서 골머리 앓던 숙제 하나 해결했네요!!


by 마농 [2019.05.27 17:07:36]

1. 셀프조인을 이용한다면?
 - 인덱스가 있어야 합니다. val1 인덱스 있는지 확인하세요.
 - 소스에서 타겟방향으로 검색하려면? +-500 의 위치가 반대로 되어야 합니다.
2. 분석함수를 이용하면 조인 없이 가능합니다.
 - RANGE BETWEEN 구문 이용


by Langs [2019.05.28 09:53:06]

답변 감사합니다~ 셀프 조인 사용하려면 해당 컬럼에 인덱스가 있어야 속도가 나오나보네요.

위 랑에님도 말씀해주신 분석함수 이용해서 해결했네요 감사합니다~

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