我正在编写从 pg_stat_activity 系统视图(PostgreSQL 13)收集行的函数。
在这个函数中,我有一个简单的循环将 pg_stat_activity 数据插入到日志表中。
问题是当我运行该函数时,它会在第一秒插入实际的行并稍后复制它们。似乎函数作为单个事务工作,并从第一次运行时的行快照中获取数据。如何在多个单独的事务中运行函数“body”以获得每秒的结果,或者我可以有什么解决方法?
CREATE OR REPLACE FUNCTION public.fn_activity(
integer)
RETURNS void
LANGUAGE 'plpgsql'
--COST 100
--VOLATILE PARALLEL UNSAFE
AS $BODY$
declare counter integer := 0;
begin
while counter < $1 loop
raise notice 'Counter %', counter;
counter := counter + 1;
insert into public.pg_stat_activity_log("time",datid,datname,pid,leader_pid,usesysid,usename,application_name,client_addr,client_hostname,
client_port,backend_start,xact_start,query_start,state_change,wait_event_type,wait_event,state,backend_xid,backend_xmin,query,backend_type)
SELECT now()::time(0),datid,datname,pid,leader_pid,usesysid,usename,application_name,client_addr,client_hostname,client_port,backend_start,xact_start,query_start,
state_change,wait_event_type,wait_event,state,backend_xid,backend_xmin,query,backend_type
from pg_stat_activity;
raise notice '-------';
PERFORM pg_sleep(1);
end loop;
return;
END;
$BODY$;
truncate table public.pg_stat_activity_log;
select public.fn_activity(60);
目前我只有 14:53:15 的结果,但需要: 14:53:15 14:53:16 14:53:17 14:53:18
谢谢!