我有一个postgres环境,其中存储过程被广泛使用,并且这些过程很复杂,因此需要调用其他存储过程。
查询pg_stat_activity表时,会得到一条记录,该记录显示了正在调用的过程,但未给出该过程中正在调用哪些sql语句的指示。
例如选择myprocname($ 1,$ 2,$ 3,$ 4)
结果,我无法隔离可能导致性能问题的特定SQL语句。有问题的RDS是一个Amazon RDS实例,因此无法使用操作系统级别的进程访问权限(据我所能确定)。
到目前为止,我在google上搜索了有关该主题的信息,但运气不佳。
这个问题不是关于特定场景的,因为代码是专有的,我无法直接讨论,而是关于当我习惯使用的主要源代码没有提供足够详细信息时如何执行这种调整。
答案 0 :(得分:3)
有两种方法可以查看函数中的SQL语句花费多长时间:
使用auto_explain.log_nested_statements = on
启用auto_explain
。这样您就可以在PostgreSQL日志文件中的函数内查看SQL语句的持续时间和执行计划。
启用pg_stat_statements
并设置参数pg_stat_statements.track = all
。
然后pg_stat_statements
将跟踪函数中SQL语句的信息。这样,您可以查看哪些语句消耗了数据库中的时间。