暂无图片
暂无图片
暂无图片
暂无图片
暂无图片

panwei-V3.0系列-存储过程调用详细信息查看

原创 Jcccccccc 6小时前
2

1 创建测试环境

CREATE SCHEMA IF NOT EXISTS test171;

DROP TABLE IF EXISTS test171.test_log;

CREATE TABLE test171.test_log (

id SERIAL PRIMARY KEY,

proc_name VARCHAR(100),

action VARCHAR(50),

run_time TIMESTAMP DEFAULT clock_timestamp(),

data VARCHAR(200)

);

2 创建存储过程

DROP PROCEDURE IF EXISTS test171.proc_inner;

DROP PROCEDURE IF EXISTS test171.proc_outer;

CREATE OR REPLACE PROCEDURE test171.proc_inner(p_round INT)

AS

v_count INT;

v_data VARCHAR(200);

BEGIN

INSERT INTO test171.test_log (proc_name, action, data)

VALUES ('proc_inner', 'INSERT', 'round-' || p_round);

SELECT count(*) INTO v_count

FROM test171.test_log WHERE proc_name = 'proc_inner';

UPDATE test171.test_log

SET data = data || '-updated'

WHERE proc_name = 'proc_inner'

AND run_time = (

SELECT max(run_time)

FROM test171.test_log

WHERE proc_name = 'proc_inner'

);

PERFORM pg_sleep(3.5);

SELECT data INTO v_data

FROM test171.test_log

WHERE proc_name = 'proc_inner'

ORDER BY run_time DESC LIMIT 1;

END;

/

CREATE OR REPLACE PROCEDURE test171.proc_outer()

AS

i INT;

v_count INT;

BEGIN

INSERT INTO test171.test_log (proc_name, action, data)

VALUES ('proc_outer', 'START', 'outer procedure begin');

FOR i IN 1..6 LOOP

CALL test171.proc_inner(i);

END LOOP;

SELECT count(*) INTO v_count FROM test171.test_log;

UPDATE test171.test_log

SET data = data || '-outer-done'

WHERE proc_name = 'proc_outer' AND action = 'START';

END;

/

3 开启参数

instr_unique_sql_track_type = 'all';

track_stmt_stat_level = 'L0,L0';

log_min_duration_statement = 0;

-- 验证参数已生效

SHOW instr_unique_sql_track_type;

SHOW track_stmt_stat_level;

SHOW log_min_duration_statement;

-- 执行自建存储过程,已有存储过程无需自建

CALL test171.proc_outer();

查询1:查看最近10min的存储过程信息

SELECT

sh.start_time AS 调用时间,

sh.schema_name AS 模式,

sh.user_name AS 用户,

parent.query AS 父存储过程

FROM dbe_perf.statement_history sh

LEFT JOIN dbe_perf.statement_history parent

ON sh.parent_query_id = parent.unique_query_id

WHERE sh.parent_query_id != 0

AND sh.start_time >= (clock_timestamp() - interval '10 minutes')

ORDER BY sh.start_time;

查询2:信息汇总

SELECT

COUNT(*) AS 总记录数,

COUNT(CASE WHEN parent_query_id = 0 THEN 1 END) AS 顶层语句,

COUNT(CASE WHEN parent_query_id != 0 THEN 1 END) AS 存储过程内部语句

FROM dbe_perf.statement_history

WHERE start_time >= (clock_timestamp() - interval '90 minutes');

查询3:存储过程内部信息(扩展查询,需要具体信息可根据自己环境定制)

SELECT

sh.start_time AS "调用时间",

sh.finish_time AS "结束时间",

sh.schema_name AS "模式",

sh.user_name AS "用户",

sh.query AS "SQL语句",

sh.parent_query_id AS "父SQL_ID",

sh.unique_query_id AS "当前SQL_ID",

parent.query AS "父存储过程",

sh.execution_time AS "执行耗时(微秒)"

FROM dbe_perf.statement_history sh

LEFT JOIN dbe_perf.statement_history parent

ON sh.parent_query_id = parent.unique_query_id

WHERE sh.parent_query_id != 0

AND sh.start_time >= (clock_timestamp() - interval '10 minutes')

ORDER BY sh.start_time;

「喜欢这篇文章,您的关注和赞赏是给作者最好的鼓励」
关注作者
【版权声明】本文为墨天轮用户原创内容,转载时必须标注文章的来源(墨天轮),文章链接,文章作者等基本信息,否则作者和墨天轮有权追究责任。如果您发现墨天轮中有涉嫌抄袭或者侵权的内容,欢迎发送邮件至:contact@modb.pro进行举报,并提供相关证据,一经查实,墨天轮将立刻删除相关内容。

评论