DB/PostgreSQL

[PostgreSQL] now(), clock_timestamp(), statement_timestamp() 차이

Kang_hobin 2024. 1. 3. 15:27

카카오 에드센스 달려면 3개월간 글 20개는 쓰라해서 딱히 영양가..없는 짧은 글을 하루에 하나씩이라도 쓰려 한다. .. 이런거라도 누군가는 보고 도움 되겠...지?

각 DBMS에는 현재 시각을 반환하는 내장 함수 들이 있다.

오라클의 SYSDATE 라던지.. Mysql의 NOW() 라던지..

오늘은 PostgreSQL 에서 현재 시각을 반환하는 함수 중 미세하게 다른 일부를 가져와서 소개하려 한다.

1. now()

누구나 잘 아는 now() 함수다. select now(); 해보면 현재 시각이 표시된다.

다만, now() 함수는 트랜잭션이 시작된 시각을 표시해준다.

이게 무슨말이냐.. 하면.. 하나의 트랜잭션에서는 모두 같은 시각을 반환한다는 것이다.. 아래 다른 함수를 보면 이해가 될 것이다.

2. statement_timestamp()

예상 했겠지만 이 함수는 트랜잭션과 관계 없이 호출됬을 때의 시각을 반환한다.

위 캡쳐를 보면 now()는 트랜잭션을 시작한 15:13에 멈춰있지만 statement_timestamp()를 보면 실시간 현재 시각을 표시하는 것을 볼 수 있다.

트랜잭션을 commit하지 않고 다시 쿼리를 실행해보면 확연히 알 수 있다.

잠시 후 한번 더 쿼리해본 결과

 

3. clock_timestamp()

요놈은 statement_timestamp()와 얼핏 보면 동일해 보이지만 차이가 있다.

바로, statement_timestamp()는 현재 명령문의 시작 시간(구체적으로는 클라이언트로부터 최신 명령 메시지를 받은 시간)을 반환하지만!! 

clock_timestamp()는  실제 현재 시간을 반환하므로 단일 SQL 명령 내에서도 해당 값이 변경된다는 것이다.

이게 무슨말인지 보려면... 아래 캡쳐를 보자.

statement_timpstamp()는 min과 max값이 동일한데, clock_timestamp()는 min과 max값이 다른 것을 볼 수 있다.

1000000번 함수를 호출하는 동안 반환됬던 실제 시각이 달라졌기 때문이라고 생각된다.