更新时间:2026-07-28 GMT+08:00
分享

常见问题

Q: 当遇到执行慢的存储过程,需要怎么分析?

A: 遇到慢存储过程,可以参考下面的流程,分析执行慢的原因:

  • 如果该存储过程正在执行,可以通过pg_stat_activity查询存储过程的执行状态;通过pg_stat_activity获取session_id后,可以调用trace接口,实时监测执行信息,语句执行计划,进一步分析执行慢的原因;
  • 在非透明多写特性下,如果该存储过程已经执行完,在不确定慢语句调用路径时,可以使用dbe_perf.statement_history,查找执行慢的语句,分析对应语句执行计划、等待事件;通过debug_query_id相同,parent_unique_sql_id为0的条件,可以找到最外层的调用语句;开启plprofiler功能,并再次执行指定存储过程,可以直观地看到该存储过程内每条语句的执行时间。

Q: 存储过程执行期间,如何结合pg_stat_activity和trace共同分析存储过程的执行情况呢?

A: 假设某个会话正在执行存储过程跑批业务,出现了执行时间过长且一直没有执行结束的情况,可以参考如下过程进行分析:
  1. 参考如下语句,查看正在执行存储过程的会话ID;
select sessionid, query from pg_stat_activity where query like '%call%' and sessionid != pg_current_sessid();
  1. 调用dbe_perf.pl_trace_func_start(sessionid)函数对相应会话进行trace;
  2. 开始trace就可以通过dbe_perf.pl_get_trace_info函数进行实时的观测,结合语句执行计划分析执行慢的原因。

Q: 当发现一个执行慢的语句,怎么确认是否是存储过程内的语句,如何借助dbe_perf.statement_history分析该语句执行慢的原因呢?

A: 当发现执行慢的语句,可以按照下面的流程分析是否是存储过程内语句,分析执行慢的原因。

  • 语句执行慢会在dbe_perf.statement_history中产生记录,借助start_time,finish_time划分时间段,找到单次执行记录,通过该条记录的parent_unique_sql_id是否是0,确认是否是存储过程内的语句;
  • 当parent_unique_sql_id非0时,搜索debug_query_id值和当前记录相同,parent_unique_sql_id值为0的记录,就是最顶层的存储过层调用语句,得到该语句的调用路径;
  • 根据该语句的执行计划、等待事件等信息,分析该语句执行慢的原因。

相关文档