PG中如何获取函数中正在执行的真实SQL语句(定位存储过程中最耗时部分)

0    174    1

Tags:

👉 本文共约3755个字,系统预计阅读时间或需15分钟。

一、 问题背景

​ 开发反馈PG中某函数执行时间很长,超过30分钟,想看看慢在其中哪一段SQL。但是如果直接通过pg_stat_activity查询,只能看到上层执行函数的语句,而不像oracle和SqlServer能看到当前在执行什么。咨询群友们得到了几种方法,下面测试和对比一下。
简单模拟如下:

执行函数
img
查看运行情况

img

二、 方法汇总及对比

img

三、 直接分析函数代码

\sf 函数名 可以查看函数代码,这适用于函数非常简单的场景,例如我们的例子
img
如果函数中SQL很长,输出可能会错行,不方便分析,可以用psql将其导出成文本。

四、 raise notice打标记

注意raise要用plpgsql语言,像上面用sql会报错,为方便测试稍微做点改造。

输出如下
img

五、 auto_explain显示每个SQL执行计划

​ 对于业务量大的库,不适合全局抓取SQL,可以在客户端开启。设置以下参数,核心是log_nested_statements = true,展示函数内所有SQL执行计划。

效果如下

本人提供Oracle(OCP、OCM)、MySQL(OCP)、PostgreSQL(PGCA、PGCE、PGCM)等数据库的培训和考证业务,私聊QQ646634621或微信dbaup66,谢谢!
AiDBA后续精彩内容已被站长无情隐藏,请输入验证码解锁本文!
验证码:
获取验证码: 请先关注本站微信公众号,然后回复“验证码”,获取验证码。在微信里搜索“AiDBA”或者“dbaup6”或者微信扫描右侧二维码都可以关注本站微信公众号。

标签:

Avatar photo

小麦苗

学习或考证,均可联系麦老师,请加微信db_bao或QQ646634621

您可能还喜欢...

发表回复