WHERE 절의 CASE 문 성능차이? 0 5 15,198

by 라스훈 [SQL Query] WHERE CASE [2010.02.12 13:37:52]



안녕하세요..

SELECT * FROM TABLE_A
WHERE 1=1
 AND CASE @A WHEN 1 THEN 1 ELSE COL1 END = CASE @A WHEN 1 THEN 1 ELSE @A END
 AND CASE @B WHEN 1 THEN 1 ELSE COL2 END = CASE @B WHEN 1 THEN 1 ELSE @B END

@A 와 @B 에 각각 1 의 값이 할당됐을경우..

이런 쿼리에서 WHERE 에서 CASE 문이 있을때와 없을때의 성능차이가 너무 많이 납니다..

제 생각에는 @A 와 @B 가 각각 1 이라면 1=1 AND 1=1 같은 조건이 나올거 같아 사용 했는데 좀 느리네요..

CASE 문 대신 1=1 AND 1=1 AND 1=1 을 쓰면 속도차이가 없습니다.

WHERE 절에서 CASE 문으로 동적 조건을 줄때 느려지는 이유가 뭘까요?

by 마농 [2010.02.12 13:48:02]
제가 볼땐 case가 문제가 아니라 쉬운걸 어렵게 푸신게 문제인듯 하네요.
WHERE 1 = 1
AND (@A = 1 OR col1 = @A)
AND (@B = 1 OR col2 = @B)

by 이예진 [2010.02.15 22:33:10]
예 저도 case문이 문제가 아니라고 봅니다.
라스훈님의 where절을 보면...
왼쪽에 값을 가공하고 오른쪽 값도 가공하여야 비로소 두 값이 같은지(=) 비교할 수있는 상태가 됩니다.
@A에 1값을 넣을 경우엔 조건을 걸지 않겠다는 의도인가요?
AND COL1 = case 절

by 엉쿰돌이 [2010.02.16 13:23:28]
case or decode 문은 인덱스와 안친해요 속도가 문제라면 index를 타는 조건을 보심이 어떨까요

by 라스훈 [2010.02.16 16:13:00]
@A 에 1값을 넣을때는 조건을 걸지 않겠다는 의도였는데요.. 속도가.. 넘 느리네요.

마농님의 답변대로 해봤는데 그래도 속도가 안나옵니다...
ASP 코드에서 조건없을땐 쿼리 문자열에서 저 조건을 빼는 방법밖엔 없을까요?

by 마농 [2010.02.16 16:19:23]
1. 들어오는 조건에 따라 쿼리를 동적으로 구성하시는 방법
- 어플리케이션 단계에서 쿼리 작성
2. 조건절에서 모든 조건을 수용하는 포괄적인 조건을 사용하는 방법
- 위의 방법 : or, case
3. 들어오는 조건에 따라 달리 수행되는 각각의 쿼리를 Union All로 묶어서 사용하는 방법
SELECT * FROM t WHERE @A = 1 AND @B = 1
UNION ALL
SELECT * FROM t WHERE @A != 1 AND @B = 1 AND col1 = @A
UNION ALL
SELECT * FROM t WHERE @A = 1 AND @B != 1 AND col2 = @B
UNION ALL
SELECT * FROM t WHERE @A != 1 AND @B != 1 AND col1 = @A AND col2 = @B
;
댓글등록
SQL문을 포맷에 맞게(깔끔하게) 등록하려면 code() 버튼을 클릭하여 작성 하시면 됩니다.
로그인 사용자만 댓글을 작성 할 수 있습니다. 로그인, 회원가입