TEST테이블이 5천만건이고 CODETABLE 테이블이 2천만건 인데..
SELECT FN_TEST(MEMO) FROM TEST 이렇게 했을경우 몇시간이 지나도 결과값이 안나오고...
SELECT FN_TEST(MEMO) FROM TEST WHERE ROWNUM =1
이렇게 한건만 SELECT하는데도.....1분 50초가 걸리네요....
MEMO컬럼이...여러가지 내용을 담고있는데
======================
ex)
853153874 지역 전화
코드번호 2340985324 가입방법
=======================
이렇게 되어있는데
그 문자열속에 코드를 찾으면 CODETABLE 에서 찾아가지고
REPLACE 해야 하거든요...
그래서 LIKE 검색을 FUNCTION 에 넣어놨는데....이게 영 속도가.....엄청 느려서요...
방법을 모르겠어서 올립니다...부탁좀드립니다....ㅠ
CREATE OR REPLACE FUNCTION FN_TEST(MEMO IN VARCHAR2)
RETURN VARCHAR2
IS
v_sq VARCHAR2(4000) := MEMO ;
CURSOR cur1 IS
SELECT ACODE, TCODE
FROM CODETABLE
WHERE MEMO LIKE '%' || ACODE|| '%'
;
BEGIN
FOR c IN cur1
LOOP
v_sq := REPLACE(v_sq, c.ACODE, c.TCODE);
END LOOP;
RETURN v_sq;
EXCEPTION
WHEN OTHERS THEN
RETURN v_sq;
END;
요건 다른 사이트에서 제가 답변 드린 내용 같군요 ^^
워낙 건수가 많네요.
데이터 많은거야 어쩔수 없다 치더라도...코드가 너무 많네요...
5천만건을 루프 돌려가며 각각 2천만건식 검색하는 형상이네요.
코드 테이블에 인덱스를 만들어야 할 듯 합니다.
흔히 말하는 인덱스는 맨 처음 글자부터 찾지 않고 중간부터 찾으면 인덱스가 무의미합니다.
Full Text Search 이 키워드로 검색해 보세요.
그런데.. Full Text Search 이게 도움이 안될지도 모른다는 생각이 드네요.
검색 조건이 거꾸로네요.(MEMO LIKE '%' || ACODE|| '%')
코드에서 메모를 찾는게 아니라 메모에서 코드를 찾네요.
코드가 2천만건 정도 되면 코드가 포함관계를 맺고 있거나
- 111, 111111, 111222 등이 예가 되구요.
또는 코드가 서로 물리고 물리는 관계가 되거나
- 111 => 222
- 222 => 111 이런식인거죠.
이런 코드들도 존재할 가능성을 배재하기 어려워 보입니다.
워낙 건수가 많다보니 다양한 케이스가 존재하겠지요.
제가 처음 위 PL/SQL 을 만들어 드린건 데이터 건수가 몇건 안된다는 가정으로 만들어 드린 것입니다.
음.. 결론은 전혀 새로운 접근방법을 모색해 봐야 할 듯 하네요.
위 방법으로는 안될 듯 합니다.