select *
from 고객
where 가입일자 like '2010%'
and 고객등급 between 'A' and 'B'
고객인덱스 고객_X01(고객등급, 가입일자)
고객등급은 (A, B, C, D, E)만 가질 수 있음
위 쿼리 최적화하는게 문제입니다
select *
from 고객
where 가입일자 like '2010%'
and 고객등급 between 'A' and 'B'
고객인덱스 고객_X01(고객등급, 가입일자)
고객등급은 (A, B, C, D, E)만 가질 수 있음
위 쿼리 최적화하는게 문제입니다
SELECT * FROM 고객 WHERE 고객등급 IN ('A', 'B') AND 가입일자 LIKE '2010%';
select * from 고객 where 가입일자 between '20100101' and '20101231' and 고객등급 in ('A', 'B');
in-list iterator로 작동하게끔 그리고 가입일자 between으로 바꿔주고
음.. in으로만 변경해도될거같긴한데 % 와일드문으로할때 스캔범위가 추가되는경우가 있었던 거 같은데 여기서는 동일할듯
가입일자를 Like로 작동시키면 엣지 케이스에서 손해가 발생할 수 있음 근데 Between은 적어도 손해는 없음(B를 스캔한다고 했을때) Like로 하면 스캔할 때 201000이 저장되어 있을수도 있어서 2010의 모든 데이터를 다 스캔해야 하는데 Between쓰면 B 부터 스캔할 수 있음 (나도 결과만 기억하고 과정은 까먹어서 책 찾아봄 친절한 SQL 209 page)
Between > in 근데 like에서 저렇게 between으로 바꿔야할 때가 무슨 상황이 있지
like -> between은 좀 어려운거같은데 between -> in으로는 많이 바꾸는데 그래서 SQL 잘 모르는데 튜닝한다는 애들보면 서브쿼리 IN절에 죄다 박아놓잖아
문자형 아닌데 문자 like로 뭘 쓸 생각을 말라
ㅇㅎㅇㅎ like > between으로 바꿔야 하는 이유를 알겠네
문자형 아니여도 like 필요할때 있는데 ㅋㅋ
옵션이나 이럴때 유용하게 처리할 수 있긴하지 근데 위 경우는 Between이 맞다
내부적으로 캐스팅 일어나는 경우에는 인덱스 못태운다..
between을 union으로 변경하고 where 고객등급 = 'A' - dc App
union all - dc App
개떡같이 짜네.