개발로 자기계발
728x90

데이터베이스에서 쿼리를 수행할 때, 조건 판단 방식이 쿼리의 성능에 큰 영향을 미칠 수 있다. 이 포스팅에서는 WHERE 절에 CASE WHEN 구문을 사용하는 방식과 UNION을 사용하는 방식을 비교하며, 어떤 방식이 더 효율적인 쿼리 성능을 제공하는지 알아보려고 한다.

이 문제는 https://okky.kr/questions/389347 이 사이트에서 확인했다.

 

우선, SQL 쿼리에서 CASE WHEN 구문은 각 행을 하나씩 검사하면서 조건을 판단한다. 이로 인해 데이터베이스는 모든 행을 전체 검색(Full Scan)해야 하며, 이는 쿼리의 성능을 저하시킨다.

SELECT F.friend_one, F.friend_two, F.requested_id, F.status
FROM users U, friends F
WHERE
CASE
	WHEN F.friend_one = #{id}
	THEN F.friend_two = U.id
	WHEN F.friend_two= #{id}
	THEN F.friend_one= U.id
END
AND F.status = 1

반면에 UNION은 두 개의 별개의 쿼리를 하나의 결과 집합으로 결합한다. 이는 각 쿼리가 개별적으로 실행되며, 각 쿼리의 WHERE 조건이 먼저 계산되므로, 모든 행을 검사할 필요가 없다. 이는 쿼리 성능을 향상하는 좋은 방법이다.

SELECT F.friend_one, F.friend_two, F.requested_id, F.status
FROM users U
JOIN friends F ON F.friend_two = U.id
WHERE F.friend_one = {id} AND F.status = 1

UNION

SELECT F.friend_one, F.friend_two, F.requested_id, F.status
FROM users U
JOIN friends F ON F.friend_one = U.id
WHERE F.friend_two = {id} AND F.status = 1

예를 들어, CASE WHEN 구문을 사용하는 것은 큰 백화점에 가서 특정 상품을 찾기 위해 모든 층, 모든 매장을 돌아보는 것과 같다. 반면에 UNION을 사용하는 것은 두 개의 작은 상점에 각각 방문해서 상품을 찾는 것과 같다. 각 상점은 크기가 작아서 상품을 찾는 시간이 짧을 뿐만 아니라, 처음부터 상품이 없다는 것이 분명하다면 실제로 상점에 들어가지 않아도 된다.

따라서, CASE WHEN 구문을 사용할 때보다 UNION을 사용할 때 쿼리의 성능을 더 향상할 수 있다. 이는 UNION이 WHERE 절의 조건을 먼저 검사하며, 인덱스를 효율적으로 활용하기 때문이다. 이에 따라 CASE WHEN 구문 대신 UNION을 사용하여 쿼리를 최적화하는 것을 고려해 보면 좋을 것이다.

 

참고


스택오버플로우에서는 쿼리의 모양이 다르다.
http://stackoverflow.com/questions/43781585/mysql-5-7-slow-case-when-then-query
728x90
SMALL
profile

개발로 자기계발

@김잠봉

틀린부분이나 조언이 있다면 언제든 환영입니다:-)