1、背景
sysdate函数是非常实用且常见的系统内置函数,尤其是在ORACLE 和 MySql 数据库中广泛使用。主要用来获取服务器当前的日期和时间,这对于进行实时数据记录、审计跟踪、有效期计算等场景特别有用。sysdate函数返回的是函数被调用时数据库服务器的当前日期和时间。这也意味这每次sysdate被执行,都会得到最新的时间值,所以常用来在函数执行时,根据系统时间定位执行函数中的SQL的运行时长。而在梧桐云原生分析型数据库的UDF函数中多次调用sysdate和now函数得到的服务器时间一样,影响业务的正产运行。
2、UDF函数中测试sysdate和now函数
2.1 封装UDF函数
create or replace function UDF1()
returns text as
$$
declare
time1 timestamp;
time2 timestamp;
time3 timestamp;
time4 timestamp;
BEGIN
–sysdate函数使用
select sysdate() into time1;
–暂停10秒
perform pg_sleep(10);
select sysdate() into time2;
–now函数使用
select now() into time3;
–暂停10秒
perform pg_sleep(10);
select now() into time4;
–打印出时间
raise info ‘time1:%’,time1;
raise info ‘time2:%’,time2;
raise info ‘time3:%’,time3;
raise info ‘time4:%’,time4;
return null;
end;
$$language plpgsql ;
2.2 测试UDF函数

结论:UDF函数中属于一个事物,在一个事务中sysdate()和now()获取服务器当前的时间是一致的,是事务开始的时间,无法从日志层面看到sql的运行时长,影响业务的正常运行。
3、解决方法
3.1 代替函数
用timeofday()来代替sysdate()和now()函数。
3.1 具体实现
create or replace function UDF2()
returns text as
$$
declare
time1 timestamp;
time2 timestamp;
BEGIN
** select timeofday()::timestamp into time1; **
–暂停10秒
perform pg_sleep(10);
**select timeofday()::timestamp into time2; **
–打印出时间
raise info ‘time1:%’,time1;
raise info ‘time2:%’,time2;
return null;
end;
$$language plpgsql ;

4 测试结论
在梧桐云原生分析型数据库的UDF函数中sysdate()和now()函数可以使用timeofday()来代替使用。

被折叠的 条评论
为什么被折叠?



