오라클 쿼리 조건의 lengthb(col1) <= 10 속도(?) 1 6 522

by 안쓰 [SQL Query] [2019.09.06 13:16:41]


안녕하세요~ 초급개발자 입니다

구글로 찾아보다가 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초안에 나오던 쿼리가 몇분이지나도록 안나옵니다 ㅠㅠ

 

혹시 정보가 부족하지만 이정도만으로도 참고해야할만한 사항을 답변주실분 계실까요?

 

by jkson [2019.09.06 13:23:56]

 


select *

from
(
select rownum, col1, col2, col3,... a.col1 as a_col1
from tab a, tab b
where a.id = b.id
and a.col1 in (subquery)
and b.col1 not exists (subquery)
)
where lengthb(a_col1) <= 10
이렇게 해보세요


by 안쓰 [2019.09.06 13:42:42]

jkson 님  헐... 답변 지렸습니다

쿼리 1초만에나옵니다 답변정말 감사드립니다 !

혹시 이럴때 어떻게 문제해결을 시작하는지 설명해주실수 있을까요?ㅠㅠ

어디부터 풀어나가야할지 1도모르겠어서요..


by jkson [2019.09.06 13:49:01]

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

이렇게 해도 되실 수 있습니다.

해당 힌트는 조건절 순서대로 필터하라는 것인데 서브쿼리가 조인으로 풀릴지

필터로 풀릴지 제가 알 수 없어서

위의 쿼리로 답변드렸습니다.


by 안쓰 [2019.09.06 14:29:03]

친절하게 설명까지 남겨주셔서 정말감사합니다 !!

서브쿼리로 감싸보긴 했었는데 rownum 역할은 몰랐습니다..

혹시 이런 수정을 공부하려면

실행계획,튜닝,힌트

이키워드로 공부하는게 맞을까요?

튜닝 관련한 책을 시작하면될까요?

 


by jkson [2019.09.06 17:06:59]

한 번쯤 책을 정독해보시는 게 좋을듯합니다.

아무래도 인터넷에서는 특정 키워드로만 검색해볼 수밖에 없기 때문에

내가 뭘 모르고 있는지조차 알기 어렵고

문제를 직면해서야 관련 정보를 얻을 수 있는 반면,

책은 a to z로 전반적 지식을 얻을 수 있는 매체라고 생각합니다.


by 안쓰 [2019.09.06 17:30:22]

오늘 바쁜일정에도 신경써주셔서 답변달아주셔서

진심으로 감사드립니다 !

책도 참고하고 앞으로도 많이배우겠습니다~!!

주말잘보내세요 ^^

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