-
2024-05-20 PostgreSQLPostgreSQL ナレッジ
PostgreSQLで現在時刻を確認する方法(current_timestampとclock_timestampの違い)
PostgreSQL で現在時刻を確認する関数
PostgreSQL で現在時刻を取得したい場合、current_timestamp 関数を利用するのが一般的かと思います。
この current_timestamp 関数は、より厳密にいいますと「トランザクションの開始時刻」を返す関数となっています。
そのため、トランザクション内で current_timestamp 関数を実行した場合、その current_timestmap 関数を実行した時点での時刻ではなく、トランザクションが開始された時点の時刻が返されることになります。
current_timestamp() 関数の挙動確認
具体的に current_timestamp() 関数を実行して挙動を確認します。
postgres=# BEGIN;
BEGIN
postgres=*# SELECT current_timestamp;
current_timestamp
-------------------------------
2024-05-15 09:30:59.009881+09
(1 row)
postgres=*# SELECT current_timestamp;
current_timestamp
-------------------------------
2024-05-15 09:30:59.009881+09
(1 row)
postgres=*# SELECT current_timestamp;
current_timestamp
-------------------------------
2024-05-15 09:30:59.009881+09
(1 row)
上記のとおり、トランザクション内では何回 current_timestamp 関数を実行しても、結果として返される時刻は、トランザクション開始時点の時刻となります。
では、トランザクション内でその時点の時刻を取得したい場合にはどうすればよいのかといいますと、clock_timestamp() 関数を実行します。
clock_timestamp() 関数の挙動確認
具体的に clock_timestamp() 関数を実行して挙動を確認します。
postgres=# BEGIN;
BEGIN
postgres=*# SELECT clock_timestamp();
clock_timestamp
-------------------------------
2024-05-15 09:31:08.525492+09
(1 row)
postgres=*# SELECT clock_timestamp();
clock_timestamp
-------------------------------
2024-05-15 09:31:09.730662+09
(1 row)
current_timestamp 関数とは違い、トランザクション内でも clock_timestamp() 関数は実行した時点の時刻を返されることを確認できました。
current_timestamp 関数と clock_timestamp() 関数の実行速度の確認
current_timestamp 関数と clock_timestamp() 関数の実行速度の違いについても確認しました。
環境は
- PostgreSQL 16.2
- Ubuntu 22.04.1 LTS
です。
計測方法
pgbench を利用して、current_timestamp 関数および clock_timestamp() 関数を実行する SQL を 60 秒間しつづけて、結果を比較しました。
current_timestamp 関数と clock_timestamp() 関数の実行速度の比較
関数 | SQL 実行回数 | レイテンシ |
---|---|---|
current_timestamp | 667,180 回 | 0.090 ms |
clock_timestamp() | 658,875 回 | 0.091 ms |
関数を 60 秒間実行し続けた際の、1 回あたりの実行速度の差は 0.001 ms となりました。
誤差みたい速度差ですので、(検証した環境では)current_timestamp 関数と clock_timestamp() 関数の速度差はないものとして扱って問題ないと思います。
(余談)current_timestamp() 関数の後ろに () が不要な理由
ここで余談となりますが、SQL 実行する際に current_timestamp 関数の後ろに () をつけるとエラーとなります。
clock_timestamp() 関数の後ろの () を省略するとエラーになります。
これは PostgreSQL の仕様によるもので、関数の後ろには () が必要なのですが、current_timestamp 関数など一部の関数(SQL標準関数)は () が不要になっています。
まとめ
結局のところ current_timestamp 関数と clock_timestamp() 関数のどちらを実行すべきか、ということですが、基本的には SQL 標準関数である current_timestamp 関数を使うことが推奨となります。
ただ、前述のとおり current_timestamp 関数はトランザクション開始時点の時刻を返す関数となりますので、トランザクション内で現在時刻を確認したい場合には clock_timestamp() 関数の実行が必要となります。