제가 질문 하나 하겠습니다.. 0 4 2,062

by 정순표 [2007.04.27 17:03:19]


between 과 in에 관한 이야기인데요.

 

index는 ind1 (start_date , top_sa_dtl_cd)

이걸 이용한다고 했을경우

 

between 과 in의 차이점은 있을까요?..

 

select  *

from test

where start_date between '20070101' and '20070430'

and   top_sa_dtl_cd in('5264','2541','6542');

 

그냥 뚱딴지 같은 질문 하나 했습니다...

악플도 받아 들임 ^^ ㅋ

 

참고로 대용량 디비입니다.

 

by finecomp [2007.04.27 00:00:00]
위 조건으로 제가 아는대로 말씀드릴께요...;
인덱스가 start_date + top_sa_dtl_cd로 구성되어 있다고 가정할 때,
Between, 부등호, Like등의 범위처리에서는 선분으로 인식하기 때문에 사람은 '20070101'다음이 '20070102'이라는 것을 알지만 옵티마이저는 이를 알지 못하기 때문에 top_sa_dtl_cd의 in에 해당하는 데이터들을 모두 찾았음에도 불구하고 '20070101'의 나머지 범위를 전부 scan해 볼 수 밖에 없습니다.
이런 이유로 인덱스1차 컬럼이 부분범위로 되어 있어 top_sa_dtl_cd컬럼은 인덱스컬럼임에도 인덱스를 scan하지 못하고 data check역할 밖에 못합니다.

반면 in이나 =의 방법에서는 점의 처리이기 때문에 원하는 대로 처리가 되지만,
위 처럼 중복 IN을 처리하는 경우 안되는 상황에 따라 범위처리처럼 되는 경우가 있으니 이는 반드시 그때 그때 확인 해야만 합니다.

건승하시길...수고하세요~~

by 정순표 [2007.04.27 00:00:00]
역쉬 성시현님은 모르는게 없는거 같아요 >< ^^..
제가 해깔려서 질문을 했습니다.^^;
제가 아직 초보라서 ^^;;

매번 답글 보면서 감동합니다 ... ㅋ
즐거운 하루되세요~~

by 강정식 [2007.04.27 00:00:00]

by 현 [2007.04.27 00:00:00]
finecomp님께서 정확히 설명해 주셨는데요,
선분과 점의 처리라는 개념에서 접근 하시면 됩니다.
댓글등록
SQL문을 포맷에 맞게(깔끔하게) 등록하려면 code() 버튼을 클릭하여 작성 하시면 됩니다.
로그인 사용자만 댓글을 작성 할 수 있습니다. 로그인, 회원가입