안녕하세요~ 초급개발자 입니다
구글로 찾아보다가 sql 처리중 질문드립니다~
-- 대략적인 쿼리 구조 !
select col1, col2, col3,...
from tab a, tab b
where a.id = b.id
and a.col1 in (subquery)
and b.col1 not exists (subquery)
두개 테이블을 이너조인하여 데이터를 조회하구요
각각 테이블a,b의 건수는 약 60만건,800만건 입니다
이미 여러개의 조건들로해서 완성된 쿼리인데요
조언을 구하고자 하는부분은 조건 where 절에
lengthb(a.col) <= 10
a.col 을 숫자로만 10글자를 체크하기위해 조건을 추가했는데
기존엔 3초안에 나오던 쿼리가 몇분이지나도록 안나옵니다 ㅠㅠ
혹시 정보가 부족하지만 이정도만으로도 참고해야할만한 사항을 답변주실분 계실까요?
lengthb(a_col1) <= 10 조건을 추가하신 게 실행계획을 바꿨을 거라 생각했고
아마도 lengthb 조건을 먼저 수행하면서 문제가 생긴 게 아닌가 해서 기존 쿼리 먼저 수행후
해당 조건으로 필터하게 유도한 거예요.
서브쿼리에 rownum을 쓰면 바깥 조건이 안으로 침투 못 하고 rownum있는 블럭 먼저 수행하게 됩니다.
같은 원리로
select /*+ordered_predicates*/col1, col2, col3,...
from tab a, tab b
where a.id = b.id
and a.col1 in (subquery)
and b.col1 not exists (subquery)
and lengthb(a_col1) <= 10
이렇게 해도 되실 수 있습니다.
해당 힌트는 조건절 순서대로 필터하라는 것인데 서브쿼리가 조인으로 풀릴지
필터로 풀릴지 제가 알 수 없어서
위의 쿼리로 답변드렸습니다.