본문 바로가기

프로그래밍

[마리아 DB] SYSDATE() 와 NOW() 의 차이점

마리아 DB SYSDATE()와 NOE()의 차이점

SYSDATE()와 NOW()는 다르다

마리아 DB 현재 시각을 리턴해주는 함수 SYSDATE()NOW() 사이에는 중대한 차이점이 있습니다. 그 차이점을 확인해보고 올바르게 사용하는 방법을 알아보려 합니다.

 

SYSDATE() 와 NOW() 는 다르다. (Designed by Freepik)

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() 의 차이

 

NOW() 함수는 하나의 쿼리문이나 루틴 내에서 항상 고정된 값을 리턴하므로 상수로 처리될 수 있지만 SYSDATE() 는 매번 새로운 값을 리턴하므로 예측 불가능한 성질을 가졌다고 간주됩니다.  

SYSDATE()는 Full Scan을 발생시킬 수 있다

상수로 처리되지 못하는 SYSDATE()의 예측 불가능한 속성 덕분에 WHERE 절에서 날짜 타입에 대한 비교 값으로 사용하는 경우에 해당 칼럼에 인덱스가 존재하더라도 인덱스를 사용하지 않는 Full Scan 이 발생하는 실행계획이 생성됩니다. 반면 NOW() 함수의 경우는 상수로 처리되므로 의도한대로 날짜 칼럼에 대한 인덱스를 타는 실행계획이 생성됩니다.

 

SYSDATE() 사용시 Full Scan 실행계획

 

따라서 이러한 혼란을 줄이기 위해서는 가급적 모든 경우에 대해서 NOW() 를 사용하도록 가이드하는 것이 좋습니다.

 

마리아 DB 구동 시 --sysdate-is-now 옵션을 지정하는 방법도 있습니다. 해당 옵션을 지정하면 SYSDATE() 함수가 NOW() 함수의 별칭(Alias)으로 처리되어 NOW() 함수를 사용하는 것과 동일한 동작을 보장합니다. 

참고자료

https://mariadb.com/kb/en/sysdate/

 

https://mariadb.com/kb/en/now/