질문을 하기 위해 테스트 쿼리를 만들려다가 그냥 본쿼리를 보고 문의드리는것이 나을거 같아 본쿼리 올립니다.
SELECT T3.*
FROM (
SELECT ROWNUM NUM, T2.*
FROM (
SELECT T1.*, TO_CHAR(T1.DISTANCE_NUMBER, 'FM999,990.0') || ' km' DISTANCE
FROM (
SELECT A.EMAIL, A.NICK_NAME, A.JENDER, A.INTRODUCE,
(SELECT FILE_URL_PATH || FILE_NAME_THUMB
FROM MT_MEMBER_FILE D
WHERE D.MEMBER_EMAIL = A.EMAIL AND D.FILE_INDEX = B.FILE_INDEX) URL,
CALC_DISTANCE(A.LATITUDE, A.LONGITUDE, TO_NUMBER('37.627072325'), TO_NUMBER('127.0333922')) DISTANCE_NUMBER --거리구하는 사용자함수사용
FROM MT_MEMBER A,
(SELECT MEMBER_EMAIL, MIN(FILE_INDEX) FILE_INDEX
FROM MT_MEMBER_FILE
GROUP BY MEMBER_EMAIL) B
WHERE A.JENDER <> 'F'
AND A.EMAIL = B.MEMBER_EMAIL(+)
AND A.BIRTH_DATE <= '20111231'
AND A.BIRTH_DATE >= '10111231'
AND A.REPORT_COUNT < 4
AND A.LATITUDE IS NOT NULL
) T1
WHERE T1.DISTANCE_NUMBER >= 0 AND T1.DISTANCE_NUMBER <= 99999 -- 이 조건이 문제가 되네요...이조건만 빼면 실행시간 반으로 줄어들고요 (1)
ORDER BY T1.DISTANCE_NUMBER -- 이거까지 빼면 완전빨라요... (2)
) T2
WHERE ROWNUM <=20
) T3 WHERE T3.NUM > 0;
현재 기껏해야 15000ROW 정도의 데이터가 있는데요.. 실행시간이 4초걸려요..(1)을 빼면 2초 (2)까지 빼면 1초 미만인데요...
이런식을 가단 십만이 넘으면 10초이상도 걸릴꺼 같은데요..
보시면 함수를 통하여 산출된 수치를 가지고 조건필터와 정렬을 합니다.
이럴경우 인덱스로 걸수도 없고 뭐 다른 방법 없을까요??? 조언 부탁드립니다.
|