안녕하세요.
좋은 방법이 생각이 안나서 혼자 고민하다가
고수분들께 문의드리게 되었습니다.
WHERE COL_A IN ('A%', 'B%', 'C%') 같이 조회하고 싶습니다.
하기는 데이터입니다.
기존 | 변경 | |||||
100만건 | 50건 | 100만건 | 50건 | |||
TABLE_A | TABLE_B | TABLE_A | TABLE_B | |||
COL_A | COL_B | COL_A | COL_B | |||
T01 | T01 | T01-00 | T01 | |||
T01 | T02 | T01-01 | T02 | |||
T02 | T05 | T02-02 | T05 | |||
T02 | T02-03 | |||||
T02 | T02-GG | |||||
T03 | T03-AA | |||||
T03 | T03-DSKW | |||||
T03 | T03-2003 | |||||
T03 | T03-1 | |||||
T04 | T04-053 | |||||
T04 | T04-052 | |||||
T05 | T05-051 |
SELECT * FROM TABLE_A WHERE COL_A IN (SELECT COL_B FROM TABLE_B)
기존에 TABLE_B의 값이 동적으로 변경되어 위와 같이 데이터를 조회해야 했습니다.
하지만 TABLE_A의 데이터가 변경되어 위의 쿼리는 쓸수 없게 되었습니다.
같은 결과를 얻기 위해 하기와 같이 변형하였습니다.
SELECT * FROM TABLE_A WHERE LEFT( COL_A,3 ) IN ( SELECT COL_B FROM TABLE_B )
이렇게 되자 인덱스가 타지 않으면서 엄청나게 속도가 느려졌습니다.
TABLE_A의 데이터는 100만건 정도되고
TABLE_B의 값은 50건정도 입니다.
두 테이블 다 값이 유동적입니다.
WHERE COL_A IN ('A%', 'B%', 'C%') 같이 조회하고 싶지만...
구글링을 해봐도 실제로 방법은 없는 것 같고..
혹시 좋은 방법이 있을까 싶어 이렇게 질문드리게 되었습니다.
참고로 ORACLE에서만 쓰는 함수가 있어도... 쓰면 안됩니다. ㅠㅠ
만약 쿼리로 해결을 볼 수 없다면 서버 단에서
DYNAMIC QUERY로 LIKE OR LIKE OR ... OR LIKE 50개 로 만들어서 맵핑하려고 생각중입니다.
애타게 답변 기다립니다.
읽어주셔서 감사합니다.
아무튼 최종 조회 건수가 50건인데.. 느리다면, 쿼리보다 테이블 구조 정규화가 문제가 아닌가 찍어봅니다. ㅋㅋ
느려진 문제는 "LEFT( COL_A,3 )
IN
" 요게 문제입니다.
인덱스 항목을 가공하면, 인덱스를 타지 않습니다.
다이나믹보다, 이 방법으로 풀이하시는 것이 좋을 것 같습니다.
인덱스 항목만 빠르게 조회, 중복 제거 가공하고, 가공한 값으로 등치 조건을 걸 수 있겠으나,
변경된 A테이블 데이타 변경이 아닌 컬럼을 추가하여 - 뒤 값을 따로 저장하는 것이 바람직한 것이 아닌가 생각합니다. 데이타가 많아질 수록 비용이 점점 증가 할 것 같습니다.