PL/pgSQL函数中current_timestamp始终返回相同值的问题求助
问题原因与解决方案
问题根源
PostgreSQL 里的 current_timestamp(包括 now())返回的是事务启动时的时间戳,在整个事务执行过程中其值不会发生改变。你的 PL/pgSQL 块属于一个独立事务,所以哪怕中间有耗时的计数操作或 pg_sleep 延迟,两次调用 current_timestamp 得到的依然是同一个时间。
解决方法
改用 clock_timestamp() 函数,它会返回当前实际的系统时间,每次调用都会获取最新的时间戳。
修改后的脚本:
DO $$ DECLARE counter INTEGER; BEGIN RAISE NOTICE '% -- started counting', clock_timestamp(); SELECT count(*) FROM my_table INTO counter; PERFORM pg_sleep(10); RAISE NOTICE '% -- % is the counting result', clock_timestamp(), counter; END; $$
补充说明
current_timestamp/now():属于事务级时间戳,适合需要事务内时间一致的场景(比如记录事务创建时间)clock_timestamp():实时系统时间,适合需要跟踪操作实际执行时间的场景(比如进度日志、耗时统计)
内容的提问来源于stack exchange,提问作者Julian
相关产品推荐
相关产品推荐

