최근 회사에서 코드 리팩토링을 하는 도중 의아 했던 적이 있었다.
한 사용자의 올해 누적 송금액을 가져오는 부분이었는데 현재 송금 진행 중인건과, 송금 완료된 건의 각각 SELECT 구문을 UNION 으로 합쳐서 가져오고 있었다.
기본적으로 이러한 UNION 방법은 쉽게 쿼리를 작성 할 수 있게 해준다. 하지만, 성능적인 측면에서 굉장히 큰 단점을 가질 수 있다.
위의 송금진행건을 조회하는 SELECT 구문과 송금완료된 건을 조회하는 SELECT 구문을 합치는 것이기 때문에 각 테이블을 2회 접근하게 된다. 데이터를 읽는 비용이 선형적으로 증가함은 물론, 긴 표현 때문에 개발자가 쿼리를 보는데 있어 쉽게 피로해질 수 있다.
이 문제를 최적화 할 수 있는 방법이 한가지가 있는데 SELECT 구문에서 CASE 식으로 조건을 분기처리하면 된다.
즉, 현재 송금진행, 송금완료건들의 상태를 CASE 식으로 작성하여 UNION
을 사용한 구문 없이 올해 송금액을 구할 수 있게 된다.
위의 방법을 사용하면 테이블에 대한 접근이 1회로 줄어들며, UNION 을 사용한 방법보다 성능이 2배 향상되고, 가독성도 좋아져 개발자의 피로를 덜어 줄 수 있다.
UNION을 사용한 분기는 SELECT 구문을 단위로 분기처리한다. 반면 CASE 키워드는 식을 바탕으로 하는 사고 이기때문에 최적화 하는데 있어 중요하다.
reference : https://www.hanbit.co.kr/channel/category/category_view.html?cms_code=CMS8208581587