合 PG中如何获取函数中正在执行的真实SQL语句(定位存储过程中最耗时部分)
Tags: PGPostgreSQL存储过程慢SQL函数SQL语句正在执行
- 一、 问题背景
- 二、 方法汇总及对比
- 三、 直接分析函数代码
- 四、 raise notice打标记
- 五、 auto_explain显示每个SQL执行计划
- 六、 设置pg_stat_statements.track=all
- 七、 使用plprofiler插件
- 一、 plProfiler插件简介
- 二、 plProfiler插件安装
- 1. 安装准备
- 2. plprofiler下载及安装
- 3. 数据库中创建插件
- 三、 plProfiler插件测试
- 1. 测试案例准备
- 2. 密码配置
- 3. plprofiler调用函数
- 4. 报表展示
- 四、 常见报错处理
- 1. 编译报错
- 2. plprofiler客户端安装报错
- 3. plprofiler命令执行报错
- 4. plprofiler无法识别到
- 5. plprofiler要求输入用户密码
- 6. plprofiler输出报表为空
- 参考
一、 问题背景
开发反馈PG中某函数执行时间很长,超过30分钟,想看看慢在其中哪一段SQL。但是如果直接通过pg_stat_activity查询,只能看到上层执行函数的语句,而不像oracle和SqlServer能看到当前在执行什么。咨询群友们得到了几种方法,下面测试和对比一下。
简单模拟如下:
1 2 3 4 5 6 7 8 9 10 11 12 13 | create table test(id int); INSERT INTO test(id) VALUES (generate_series(1, 10000)); create table test2(id int); INSERT INTO test2(id) VALUES (generate_series(1, 10000)); create or replace function test_f() returns int as $$ select count(*) from test; select count(*) from test2; select count(*) from test,test2; $$ language sql; |
1 2 | select pid,usename,substring(query from 0 for 50),now()-query_start as time,wait_event_type,wait_event from pg_stat_activity where state = 'active'; |
二、 方法汇总及对比
三、 直接分析函数代码
\sf 函数名 可以查看函数代码,这适用于函数非常简单的场景,例如我们的例子
如果函数中SQL很长,输出可能会错行,不方便分析,可以用psql将其导出成文本。
1 | psql -c "\sf test_f" > test_f.sql |