CREATE OR REPLACE FUNCTION populate_pg_stat_statements_current(interval_label TEXT DEFAULT '1m') RETURNS void AS $$ DECLARE prev_table TEXT := 'pgss_prev_' || interval_label; result_table TEXT := 'pgss_cur_' || interval_label; dynamic_sql TEXT; BEGIN dynamic_sql := format($fmt$ TRUNCATE TABLE %I; -- current WITH current AS ( SELECT dbid, userid, queryid, query, calls, total_exec_time FROM pg_stat_statements WHERE query NOT ILIKE '%%pg_stat_statements%%' AND query NOT ILIKE 'CREATE TABLE IF NOT EXISTS %%' AND calls > 0 ), diff AS ( SELECT curr.query, curr.calls - COALESCE(prev.calls, 0) AS delta_calls, curr.total_exec_time - COALESCE(prev.total_exec_time, 0) AS delta_time, ROUND(( (curr.total_exec_time - COALESCE(prev.total_exec_time, 0)) / NULLIF(curr.calls - COALESCE(prev.calls, 0), 0) )::NUMERIC, 3) AS avg_time FROM current curr LEFT JOIN %I prev ON curr.dbid = prev.dbid AND curr.queryid = prev.queryid AND curr.userid = prev.userid WHERE curr.calls - COALESCE(prev.calls, 0) > 0 ) INSERT INTO %I(query, delta_calls, delta_time, avg_time) SELECT query, delta_calls, delta_time, avg_time FROM diff ORDER BY delta_time DESC LIMIT 15; TRUNCATE TABLE %I; -- previous INSERT INTO %I(dbid, userid, queryid, query, calls, total_exec_time) SELECT DISTINCT ON (pss.dbid, pss.userid, pss.queryid) pss.dbid, pss.userid, pss.queryid, pss.query, pss.calls, pss.total_exec_time FROM pg_stat_statements pss WHERE pss.query NOT ILIKE '%%pg_stat_statements%%' AND pss.query NOT ILIKE 'CREATE TABLE IF NOT EXISTS %%' AND pss.calls > 0 ORDER BY pss.dbid, pss.userid, pss.queryid, pss.total_exec_time DESC ON CONFLICT (dbid, userid, queryid) DO UPDATE SET query = EXCLUDED.query, calls = EXCLUDED.calls, total_exec_time = EXCLUDED.total_exec_time; $fmt$, result_table, prev_table, result_table, prev_table, prev_table); EXECUTE dynamic_sql; END; $$ LANGUAGE plpgsql;