db초보입니다..ㅠㅠ
화면에서 전체 데이터 검색 하는게 가능하면 쿼리를 like로 써왔는데 다른 분들 쿼리 작성하는거 보니까 case로 하시는 분들이 있으시더라구요.
60만건의 데이터를 like와 case로 각각 실행해봤을때 실행시간은 동일했습니다.
근데 인터넷에 찾아보니까 case를 조건절로 작성하게되면 인덱스 사용이 안된다거나, 매번 조회할때마다 실행 계획을 세우기때문에 안좋다는걸 봐서 (제가 이해를 잘못한걸지도..)
어느 방식(?)으로 쿼리를 작성하면 좋을지..
셋다 어느 방식으로해도 조회 성능(?)에는 상관이 없는지..
궁금하여 여기에 질문글을 납깁니다..
1. (like의 경우 null이 허용된 컬럼이라면 isnull(컬럼,'') like @Param +'%' 이렇게 작성했습니다..)
select *
from 테이블 (nolock)
where 컬럼1 like @Param1 + '%'
and 컬럼2 like @Param2 + '%'
and 컬럼3 like @Param3 + '%'
and 컬럼4 like @Param4 + '%'
and 컬럼5 like @Param5 + '%'
2.
select *
from 테이블 (nolock)
where (CASE WHEN @Param1 = '' THEN '' ELSE 컬럼1 END) = @Param1
and (CASE WHEN @Param2 = '' THEN '' ELSE 컬럼2 END) = @Param2
and (CASE WHEN @Param3 = '' THEN '' ELSE 컬럼3 END) = @Param3
and (CASE WHEN @Param4 = '' THEN '' ELSE 컬럼4 END) = @Param4
and (CASE WHEN @Param5 = '' THEN '' ELSE 컬럼5 END) = @Param5
3.
select *
from 테이블 (nolock)
where (CASE WHEN @Param1 = '' THEN '1' ELSE 컬럼1 END)
= (CASE WHEN @Param1 = '' THEN '1' ELSE @Param1 END)
and (CASE WHEN @Param2 = '' THEN '1' ELSE 컬럼2 END)
= (CASE WHEN @Param2 = '' THEN '1' ELSE @Param2 END)
and (CASE WHEN @Param3= '' THEN '1' ELSE 컬럼3 END)
= (CASE WHEN @Param3= '' THEN '1' ELSE @Param3END)
and (CASE WHEN @Param4 = '' THEN '1' ELSE 컬럼4 END)
= (CASE WHEN @Param4 = '' THEN '1' ELSE @Param4 END)
and (CASE WHEN @Param5 = '' THEN '1' ELSE 컬럼5 END)
= (CASE WHEN @Param5 = '' THEN '1' ELSE @Param5 END)
Comment 5
-
이리
2020.04.13 08:43
-
개린이
2020.04.14 16:20
(CASE WHEN @Param1 = '' THEN '' ELSE 컬럼1 END) = @Param1
이렇게 조건절에 사용하는것도 인덱스 컬럼을 가공하는 것과 마찬가지인가요?
-
이리
2020.04.16 09:40
컬럼 가공은 INSULL 사용의 경우를 말씀 드린겁니다.
댓글에 적어주신 경우에도 seek를 못하고 scan을 할 것 같습니다.
실행계획을 확인해보세요
-
개린이
2020.04.16 15:38
답변 감사합니다!
-
신기섭_293593
2020.05.12 17:08
조건절이 다양한 경우 왠만하면 동적쿼리 (sp_excutesql)를 활용하시고
where 절에 Case 문 사용하면 잘못된 실행계획이 만들어질 확률이 높아집니다.
편하다고 주 조건(index)에 절대 사용하시면 안되요. 옵티마이져에게는 명확한 조건을 주는게 좋습니다.
각각의 실행계획 및 IO를 확인해 보시고요.
인덱스 컬럼을 가공하면 인덱스를 사용하지 못하는건 어떠한 경우에도 동일 합니다.
성능을 생각하신다면 동적쿼리로 작성하시는것을 권장 드립니다.