DATABASE

[SQL] YEAR()은 효율적인가?

sagecode 2025. 1. 26. 16:39

처음으로 SQL 프로그래머스 문제들을 풀어보기 시작했다. 

 

정보처리기사 공부할 때 DML, DCL, DDL 공부를 하면서 잠시 쿼리문을 작성하는 것을 해보았지만 이렇게 직접 예시문제를 풀다보니 실력이 훨씬 더 빨리 느는것 같았다.

근데 이렇게 문제를 풀다가 보니 구글링하면서 배운 함수들이나 방식들은 엄청 다양해서 한 문제를 푸는 방법에도 다양한 방법이 있다는 사실을 알게 되었다. 그래서 이런 쉬운 문제를 풀때도 방식마다 장단점이 어떤게 있는지 리뷰해보려고 한다.

 

1. AND 나열과 YEAR()

SELECT COUNT(*) USERS
FROM USER_INFO
WHERE 
AGE >= 20 AND AGE <= 29
AND YEAR(JOINED) = '2021';

처음에 내가 접근했던 방식이다. 처음에 20세 이상 29세 이하를 어떻게 표현해야하지 하다가 그냥 범위 AND문으로 묶었고, JOINED에 있는 DATE문에서 년도만 추출해 올 수 있는 방식이 뭘까 고민을 했다. 원래는 string으로 접근할까 하다가 구글에 추출하는 방식을 찾아보았고 YEAR() 메소드를 사용하면 가능하다길래 사용해 보았다.

 

2. BETWEEN 사용

SELECT COUNT(*) USERS
FROM USER_INFO
WHERE 
AGE BETWEEN 20 AND 29
AND YEAR(JOINED) = '2021';

범위조건을 좀 더 간단하게 표현할 수 있는 BETWEEN이라는 문법을 사용해서 좀 더 직관적으로 범위를 표현하였다.

 

3. 불필요한 메소드 제거

SELECT COUNT(*) USERS 
FROM USER_INFO
WHERE AGE BETWEEN 20 AND 29 
  AND JOINED BETWEEN '2021-01-01' AND '2021-12-31';

그래서 좀 더 효율적인 방법이 무엇이 있을까 생각하다가 YEAR 함수가 은근 많은 비용을 차지한다는 것을 알아내었다.

 

YEAR(JOINED)는 모든 행에서 JOINED 값을 변환해야 하므로, 인덱스를 사용할 수 없게 만든다. 그래서 JONIED의 범위를 직접 입력하면서 SELECT를 할 때, index를 이용하면서 좀 더 효율적으로 원하는 값에 잘 접근할 수 있도록 만들 수 있다.

 

물론 데이터값이 적거나 쿼리문을 작성할 때, 가독성있도록 작성하고 싶을때는 YEAR()을 사용하는 것이 좋지만 검색속도를 빠르게 활용하고 싶으면 저렇게 범위를 지정해놓고 다른 메소드를 사용하지 않는것이 좋다고 한다.