
# 技术原理
#### 核心机制
当前支持语句执行前生成unique_query_id，并在DBE_PERF.STATEMENT插入一条记录，供后续归一、上报刷新使用；语句执行期间，在DBE_PERF.STATEMENT中刷新相应语句的产生的指标；语句执行完，执行记录会判断是否是慢SQL，结合track_stat_stmt_level的值，决定是否需要记录到DBE_PERF.STATEMENT_HISTORY。
存储过程场景是在存储内部语句执行前，将存储过程调用语句的unique_sql_id保存，作为存储过程内语句的parent_unique_sql_id，通过parent_unique_sql_id和unique_sql_id的值，维护语句间的调用关系。存储过程内语句执行时，在DBE_PERF.STATEMENT插入记录，每条语句执行完，结合该语句是否执行慢，以及参数track_stmt_stat_level的值确认是否需要记录到DBE_PERF.STATEMENT_HISTORY中。和非存储过程语句的区别在于，DBE_PERF.STATEMENT表中记录的指标是在整个存储过程执行完成后才会统一刷新。
#### 性能指标
instr_unique_sql_track_type设置成all，存储过程执行耗时相比于设置成top时，劣化5%左右。
#### 接口介绍
| 存储过程慢SQL支持的接口                                                                                                                         ||
|:---|---|
| 函数    | DBE_PERF.GET_FULL_SQL_BY_PARENT_ID_AND_TIMESTAMP 根据指定parent_unique_sql_id递归查询执行时间段内DBE_PERF.STATEMENT_HISTORY中，该语句及所有子语句的执行记录。 |
| 系统表   | DBE_PERF.STATEMENT_HISTORY字段parent_unique_sql_id，表示调用该语句的存储过程的unique_query_id，最顶层语句该值为0。                                       |
| 系统视图  | DBE_PERF.STATEMENT字段parent_unique_sql_id，表示调用该语句的存储过程的unique_query_id，最顶层语句该值为0。                                               |
| GUC参数 | instr_unique_sql_track_type参数all选项控制开启存储过程慢SQL特性功能。                                                                            |
   
