
# 常见问题
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();
```
2. 调用dbe_perf.pl_trace_func_start(sessionid)函数对相应会话进行trace；
3. 开始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的记录，就是最顶层的存储过层调用语句，得到该语句的调用路径；

- 根据该语句的执行计划、等待事件等信息，分析该语句执行慢的原因。
 
