SYSDATE()와 NOW()는 다르다
마리아 DB 현재 시각을 리턴해주는 함수 SYSDATE()와 NOW() 사이에는 중대한 차이점이 있습니다. 그 차이점을 확인해보고 올바르게 사용하는 방법을 알아보려 합니다.
SYSDATE()는 예측 불가능(non-deterministic) 하다
SYSDATE() 함수는 해당 함수가 호출될 때마다 매번 호출 시점의 시각을 재계산하여 리턴합니다. 반면에 NOW() 함수는 포함된 쿼리문이나 루틴이 최초 실행될 때의 시각을 리턴합니다. 이 차이는 쿼리문이나 루틴 내에서 각 함수가 여러 번 쓰이게 될 경우에 큰 차이를 만들어 냅니다.
NOW() 함수와 BETWEEN() 함수의 차이는 아래 쿼리로 명확히 알 수 있습니다.
SELECT NOW(), SLEEP(2), NOW();
+-------------------+--------+-------------------+
|NOW() |SLEEP(2)|NOW() |
+-------------------+--------+-------------------+
|2020-08-12 21:42:51| 0|2020-08-12 21:42:51|
SELECT SYSDATE(), SLEEP(2), SYSDATE();
+-------------------+--------+-------------------+
|SYSDATE() |SLEEP(2)|SYSDATE() |
+-------------------+--------+-------------------+
|2020-08-12 21:43:32| 0|2020-08-12 21:43:34|
NOW() 의 경우는 한 쿼리문에서 항상 같은 값을 리턴합니다. 반면 SYSDATE()의 경우 매번 호출될 때마다 새롭게 계산된다는 것을 확인할 수 있습니다.
SELECT NOW(), SLEEP(2), NOW(), SYSDATE(), SLEEP(2), SYSDATE();
NOW() 함수는 하나의 쿼리문이나 루틴 내에서 항상 고정된 값을 리턴하므로 상수로 처리될 수 있지만 SYSDATE() 는 매번 새로운 값을 리턴하므로 예측 불가능한 성질을 가졌다고 간주됩니다.
SYSDATE()는 Full Scan을 발생시킬 수 있다
상수로 처리되지 못하는 SYSDATE()의 예측 불가능한 속성 덕분에 WHERE 절에서 날짜 타입에 대한 비교 값으로 사용하는 경우에 해당 칼럼에 인덱스가 존재하더라도 인덱스를 사용하지 않는 Full Scan 이 발생하는 실행계획이 생성됩니다. 반면 NOW() 함수의 경우는 상수로 처리되므로 의도한대로 날짜 칼럼에 대한 인덱스를 타는 실행계획이 생성됩니다.
따라서 이러한 혼란을 줄이기 위해서는 가급적 모든 경우에 대해서 NOW() 를 사용하도록 가이드하는 것이 좋습니다.
마리아 DB 구동 시 --sysdate-is-now 옵션을 지정하는 방법도 있습니다. 해당 옵션을 지정하면 SYSDATE() 함수가 NOW() 함수의 별칭(Alias)으로 처리되어 NOW() 함수를 사용하는 것과 동일한 동작을 보장합니다.
참고자료
https://mariadb.com/kb/en/sysdate/
'프로그래밍' 카테고리의 다른 글
Node.js 를 이용한 초간단 웹서버 구축 (feat. http-server) (0) | 2020.08.04 |
---|---|
웹사이트 성능 개선을 위한 gzip 압축 적용 : Apache, Tomcat, Weblogic과 Servlet Filter (0) | 2020.07.29 |
Node.js 와 puppetter를 이용한 네이버 쇼핑 매크로 만들기 #1 (0) | 2020.07.27 |
ES6에 새롭게 추가된 자바스크립트 문법 톺아보기 #1 ECMAScript, ES6 그리고 Babel (0) | 2020.07.24 |
인텔리제이(IntelliJ IDEA) 유용한 키보드 단축키 32가지 (PC) (0) | 2020.07.23 |