제가 알고있기론 같은 컬럼을 OR 로 걸경우 index 가 타지않는다고 알고있습니다.
예를 들어 SELECT * FROM user WHERE user_id = 1 OR user_id = 2 는 index = X
그래서 보통 이런경우 상황에따라 in 이나 union 으로 나누고 있는데요
1.SELECT * FROM user WHERE (user_id is null OR user_id = 2)
2.SELECT * FROM user WHERE user_id is null
union
SELECT * FROM user WHERE user_id = 2
1번 방법으로 하였을시 성능이 2번보다 확연히 나쁠까요?
초짜 답변이니까 참고만 하세요. 다른분이 정확하고 인증된 답변 주시면 감사하겠습니다.
일단 같은 필드를 OR로 검색하면 인덱스를 안탄다는것을 어디서 들으신건지 모르겠지만(진짜 안타는건지 타는건지 저도 잘 몰라요 ㅋ;) 실행계획을 본 결과 RANGE스캔해서 인덱스를 타고 있었습니다. 필드에 조건걸때 BETWEEN으로 걸어도 보통 RANGE스캔 하기때문에 제 생각엔 같은 필드를 OR조건 검색해도 인덱스를 타는 것 같습니다.
SELECT * FROM CUSTOMERS_INDEX WHERE CUST_ID = 1000 AND CUST_ID = 1001
위의 쿼리로 실행계획 돌려 본 결과 레인지 인덱스를 타서 코스트가 5정도 나왔습니다. 데이터는 55만건 있는 테이블이에요.
그리고 1과 2의 성능차를 여쭤보셨는데. 일단 전 실행계획을 보기전에 두개의 쿼리만 보고 아래의 쿼리가 검색을 두번해서 합치기때문에 1보다 성능이 나쁠 것 같다 예상했는데
실행계획 돌려보니 위의 쿼리는 코스트가 5 아래쿼리는 테이블 하나 검색당 3씩해서 6이 나왔습니다.
문제해결에 도움되면 좋겠네요. 다만 진심으로 다른 고수분이 명확하고 검증된 답변을 주시길 저도 기다리고있겠습니다 ;