DB마다 다르긴 하지만 SQL에서는 묵시적 형변환을 지원함.
비교하고자 하는 두 값이 다른 타입일때 DB가 타입을 자동으로 맞춰서 비교하는 것.
이는 굉장히 편리한 기능이지만, 그만큼 리소스를 많이 잡아먹기 때문에 비교하고자 하는 값이 다른 타입일때 형변환을 미리 해주는것이 좋다.
1. 비교 연산자를 쓸 때 타입을 확인하기
타입확인을 해야 되는 이유!
타입 확인 없이 쿼리가 복잡해졌다고 가정해보자.
이때 원하는 쿼리의 결과가 나오지 않는다면 어디가 잘못되었는지 확인하기가 매우 어려움.
또한 리소스를 줄이기 위해
비교 연산자를 사용시 동일한 타입으로 변경 후 비교하는 것을 권장
(예시) date컬럼이 CHAR(문자열) 타입일때 실행속도 비교.

테이블
date컬럼에서 20231031 이상인 row의 수를 구해보자.
먼저 날짜 형태로 비교를 해보자.(실행속도 Slow)
SELECT count(1)
FROM clicks
WHERE date>20231031 --숫자열
SELECT count(1)
FROM clicks
WHERE date>'20231031'-- 문자열
1번은 0.0072초, 2번은 0.0057초로.
미세하지만 같은 형태로 비교한게 더 빠름.

2. WHERE 절에서 왼쪽 컬럼에 함수 적용 지양하기
왼쪽 컬럼에 함수 적용지양? 말로만 들었을 때는 잘 이해가 안될것이다.
부호 필터 등을 작성할 때
WHERE a < b
이런식으로 WHERE절을 작성하게 된다.
이때 보통 a부분에 데이터컬럼, b부분에 제한을 두고자하는 값이 들어간다.
함수는 크기가 작은 데이터에서 사용할 수록 리소스를 덜 잡아먹는다.
그렇기에 a. 즉 왼쪽 컬럼보다는 오른쪽에 함수를 적용하라고 말하는 것이다.
(예시) date컬럼에서 20231031 이상인 row 수를 추출해보자.
이때 date는 "20231031” 형태를 갖고 있으므로 형태에 맞춰 함수를 적용해보자.
WHERE절 왼쪽에 함수 적용
SELECT count(1)
FROM clicks
WHERE DATE_FORMAT(date,'%Y-%m-%d') > '2023-10-31'
SELECT count(1)
FROM clicks
WHERE date > DATE_FORMAT('2023-10-31','%Y%m%d')
물론 실무적으로 위와 같은 코드는 사용하지 않을 것 같다.예시로만 보자!
두 코드를 비교해보았을 때
왼쪽 함수 적용은 date컬럼 전체에 대해 하는 것으로 리소스를 크게 잡는다.
반면, 오른쪽 함수 적용은 ‘2023-10-31’이라는 문자열만 형태를 변경함으로 리소스를 줄일 수 있다.
프로파일링 결과!
실행 속도가 두배 이상 차이가 남.

이번에는 WITH구문에 함수를 걸어 리소스를 더욱 줄여보자.
(예시)이벤트 관련 상품을 눌러본 사람들 중, 이벤트가 끝나기 전에 누른 사람의 수를 집계해보자.
WITH clk as (
SELECT clk_index, event_index, date -- 클릭 테이블의 date 컬럼은(20231201)형식으로 저장되어있다.
FROM clicks
),
event as (
SELECT event_index, DATE_FORMAT(event_end,'%Y%m%d') as event_end_dt --이벤트 테이블의 event_end 컬럼은 2023-12-01 형식으로 저장되어 데이트포멧함수로 형식을 맞춤.
FROM events
)
SELECT count(1)
FROM clk INNER JOIN event ON
clk.clk_index = event.event_index
WHERE date <= event_end_dt
해당 코드에서는 WHERE절 이전에 함수가 아닌 크기가 비교적 작은 WITH구절에서 DATE_FORMAT 함수를 사용했다.
이렇게 하면 더욱 리소스를 줄일 수 있다.