pg_stat_activity - 如何在 运行 存储过程中查看当前 activity

pg_stat_activity - how to see current activity inside a running stored procedure

我有一个广泛使用存储过程的 postgres 环境,这些过程很复杂并调用其他存储过程。

当我查询 pg_stat_activity table 时,我得到一条显示正在调用的过程的记录,但没有给出关于在该过程中调用了哪些 sql 语句的指示.

例如。 select myprocname($1,$2,$3,$4)

因此,我无法隔离可能导致性能问题的特定 SQL 语句。有问题的 RDS 是一个亚马逊 RDS 实例,因此 OS 级别的进程访问权限不可用(据我所知)。

我已经搜索了有关此主题的 google 信息,但到目前为止运气不佳。

这个问题不是关于具体的场景,因为代码是专有的,我不能直接讨论它,而是关于当我习惯使用的主要源没有提供足够的细节时如何执行这样的调整。

有两种方法可以查看函数中的 SQL 语句需要多长时间:

  1. 启用 auto_explainauto_explain.log_nested_statements = on。这将允许您在 PostgreSQL 日志文件中查看函数内 SQL 语句的持续时间和执行计划。

  2. 启用pg_stat_statements并设置参数pg_stat_statements.track = all.

    然后 pg_stat_statements 将跟踪函数内 SQL 语句的信息。这样你就可以看到你的哪些语句在数据库中消耗了多少时间。