
# 实时TopSQL
系统提供了不同级别的资源监控实时视图用来查询实时TopSQL。资源监控实时视图记录了查询作业运行时的资源使用情况(包括内存、下盘、CPU时间等)以及性能告警信息。
实时视图具体的对外接口如下表所示：
 表1资源监控实时视图 
| 视图级别                           | 节点范围 | 查询视图                                                                                      |
|:---|:---|:---|
| query级别/perf级别                 | 当前CN | [GS_WLM_SESSION_STATISTICS](https://support.huaweicloud.com/devg-dws/dws_04_0706.html)    |
| query级别/perf级别                 | 所有CN | [PGXC_WLM_SESSION_STATISTICS](https://support.huaweicloud.com/devg-dws/dws_04_0841.html)  |
| operator_realtime级别/operator级别 | 当前CN | [GS_WLM_OPERATOR_STATISTICS](https://support.huaweicloud.com/devg-dws/dws_04_0703.html)   |
| operator_realtime级别/operator级别 | 所有CN | [PGXC_WLM_OPERATOR_STATISTICS](https://support.huaweicloud.com/devg-dws/dws_04_0838.html) |
   
![](https://support.huaweicloud.com/devg-dws/public_sys-resources/note_3.0-zh-cn.png)
- 视图级别取决于资源监控的等级，即参数[resource_track_level](https://support.huaweicloud.com/devg-dws/dws_04_0922.html#ZH-CN_TOPIC_0000001811490709__section153571329142612)的配置。
- perf和operator级别会影响[GS_WLM_SESSION_STATISTICS](https://support.huaweicloud.com/devg-dws/dws_04_0706.html)/[PGXC_WLM_SESSION_INFO](https://support.huaweicloud.com/devg-dws/dws_04_0839.html)中的query_plan和warning字段的取值，详细内容参见[SQL自诊断](https://support.huaweicloud.com/devg-dws/dws_04_0446.html)。
- 对外接口通过不同的前缀(gs与pgxc)来区分单CN查询视图以及集群级别查询视图。普通用户仅支持登录到集群的某个CN查询以gs为前缀的视图。
- 查询此类实时视图时，因需要获取作业运行实时资源使用情况，会有一定的网络延时。
- 实例故障时，实时TopSQL视图有可能记录不全。
- 实时TopSQL中能够记录的SQL语句的规格是：
  - 不记录特殊数据定义语句，如：SET、RESET、SHOW、ALTER SESSION SET、SET CONSTRAINTS语句。
  
  - 记录数据定义语句，例如：执行CREATE、ALTER、DROP、GRANT、REVOKE和VACUUM语句。
  
  - 记录数据操作语句，例如：
    - 执行SELECT、INSERT、UPDATE和DELETE语句。
    
    - 执行explain analyze和explain performance场景。
    
    - 使用query级别/perf级别视图。
     
  
  - 记录函数与存储过程的调用入口语句，当GUC参数[enable_track_record_subsql](https://support.huaweicloud.com/devg-dws/dws_04_0922.html#ZH-CN_TOPIC_0000001811490709__section7181949101319)开启的情况下，可记录存储过程的部分内部语句(declare定义语句除外)，仅会记录其中下发到DN执行的内部语句，未下发到DN执行的内部语句会被过滤掉；
  
  - 记录匿名块语句，当GUC参数[enable_track_record_subsql](https://support.huaweicloud.com/devg-dws/dws_04_0922.html#ZH-CN_TOPIC_0000001811490709__section7181949101319)开启的情况下，可记录匿名块中的部分内部语句，仅会记录其中下发到DN执行的内部语句，未下发到DN执行的内部语句会被过滤掉。
  
  - 记录游标语句，当游标没有从缓存中读取数据，而触发语句下发到DN上执行的条件下，该游标语句会被记录，并且会进行语句、执行计划增强，但当游标从缓存中读取数据时，不进行记录；当游标语句在匿名块或者函数中使用且游标从DN上读取较多数据但不完全使用时，因当前架构限制，无法记录该游标在DN上的监控信息。对于With Hold游标，该语法执行逻辑特殊，会在事务提交阶段执行实际查询动作，当语句在该阶段执行报错时，作业的aborted状态无法反馈到TopSQL历史表中。
  
  - 重分布过程中的作业不统计。
  
  - JDBC执行的带占位符语句，通常会补齐参数内容，但当参数和原语句合起来长度超过64KB，则不记录参数，或者是轻量化语句直接下发到DN上执行，不记录参数。
  
  - 从8.1.3集群版本开始，query、perf级别TopSQL运行时监控功能已完全不影响查询性能，对当前会话的语句进行资源监控的GUC参数resource_track_cost默认值已修改为0，查询TopSQL实时监控视图时，默认会显示所有正在执行的语句。
  
  - 从8.1.3集群版本开始，对于存储过程中的子语句监控功能，如果在查询TopSQL实时监控视图的会话中，开启控制子语句记录归档功能的GUC参数enable_track_record_subsql，不论业务语句中是否开启子语句监控开关，查询TopSQL实时监控视图的结果都能看到执行语句的子语句运行信息。
  
  - 关于存储过程中子语句的监控功能即enable_track_record_subsql，8.1.3集群版本中建议不要全面开启，由于没有按时间过滤子语句的功能，全面开启可能会记录过多子语句，导致归档的监控表占用大量磁盘空间；8.1.3集群版本建议仅用于查询实时监控信息，或对个别存储过程业务做定位分析时，仅开启对应会话中的参数。8.2.1及以上集群版本新增GUC参数resource_track_subsql_duration（默认值为180秒），可以通过执行时间过滤需要归档的子语句，用户可以按需调整该值大小。
  
  - 由于规格限制，对于未下盘的主语句，TopSQL历史表中的记录会有延时，等待下次作业下发时才会显示在TopSQL历史表中。
  
  - 自8.2.1.200集群版本，新增operator_realtime级别TopSQL运行时监控，提供算子级实时监控的能力，开启此级别的监控可以查询语句的执行计划以及具体执行信息，查询TopSQL算子级实时监控视图时，默认会显示所有正在执行的语句。但是对于存储过程和游标场景，暂时不支持显示算子级实时监控信息。该版本暂时不支持算子历史信息查询。
  
  - operator_realtime级别TopSQL运行时监控对于CN轻量化和存储过程的情况，暂时不支持。另由于算子执行速度较快的原因，对于算子信息的显示会有一定滞后性。
  
  - query级别的作业监控和operator的算子监控中的spill_size字段，由于统计维度不同，会有一定差异，query级别监控的语句实际下盘文件大小，算子监控的是具体算子在逻辑层IO读写的数据量。
  
  - 当GUC参数enable_stream_operator设置为off状态时，算子执行信息存在显示不准的情况。
   
 
#### 前提条件
- GUC参数[enable_resource_track](https://support.huaweicloud.com/devg-dws/dws_04_0922.html#ZH-CN_TOPIC_0000001811490709__s9530ecdd2b0d4a98b67b66e32bf8e5d0)为on （默认为on）。
- GUC参数[resource_track_level](https://support.huaweicloud.com/devg-dws/dws_04_0922.html#ZH-CN_TOPIC_0000001811490709__section153571329142612)为query、perf、operator_realtime或operator（默认为query）。
- 监控作业的类型为：优化器估算的执行代价大于或等于[resource_track_cost](https://support.huaweicloud.com/devg-dws/dws_04_0922.html#ZH-CN_TOPIC_0000001811490709__section1089022732713)的作业。
- Cgroups功能正常加载，可通过gs_cgroup -P查看控制组信息。
- GUC参数[enable_track_record_subsql](https://support.huaweicloud.com/devg-dws/dws_04_0922.html#ZH-CN_TOPIC_0000001811490709__section7181949101319)控制是否记录存储过程、匿名块内部语句。
在上述条件中，[enable_resource_track](https://support.huaweicloud.com/devg-dws/dws_04_0922.html#ZH-CN_TOPIC_0000001811490709__s9530ecdd2b0d4a98b67b66e32bf8e5d0)为系统级参数，用于设置是否开启资源监控功能。[resource_track_level](https://support.huaweicloud.com/devg-dws/dws_04_0922.html#ZH-CN_TOPIC_0000001811490709__section153571329142612)为session级参数，可以对某个session的资源监控级别进行灵活设置。这两个参数的设置方法如下表：
 表2设置资源监控信息统计级别 
| enable_resource_track | resource_track_level | query级别信息 | 算子级别信息   |
|:---|:---|:---|:---|
| on(default)           | none                 | 不统计       | 不统计      |
| on(default)           | query(default)       | 统计        | 不统计      |
| on(default)           | perf                 | 统计        | 不统计      |
| on(default)           | operator             | 统计        | 统计       |
| on(default)           | operator_realtime    | 统计        | 统计实时算子监控 |
| off                   | none/query/operator  | 不统计       | 不统计      |
   
#### 操作步骤
1. 通过视图gs_session_cpu_statistics查询实时CPU信息。 
   ```
   SELECT * FROM gs_session_cpu_statistics;
   ```
   
   
2. 通过视图gs_session_memory_statistics查询实时memory信息。 
   ```
   SELECT * FROM gs_session_memory_statistics;
   ```
   
   
3. 通过视图gs_wlm_session_statistics查询当前CN的实时资源。 
   ```
   SELECT * FROM gs_wlm_session_statistics;
   ```
   
   
4. 通过视图pgxc_wlm_session_statistics查询所有CN的实时资源。 
   ```
   SELECT * FROM pgxc_wlm_session_statistics;
   ```
   
   
5. 通过视图gs_wlm_operator_statistics查询当前CN作业算子执行实时资源信息。 
   ```
   SELECT * FROM gs_wlm_operator_statistics;
   ```
   
   
6. 通过视图pgxc_wlm_operator_statistics查询所有CN作业算子执行实时资源信息。 
   ```
   SELECT * FROM pgxc_wlm_operator_statistics;
   ```
   
   
7. 通过视图pg_session_wlmstat查询当前用户执行作业正在运行时的负载管理信息。 
   ```
   SELECT * FROM pg_session_wlmstat;
   ```
   
   
8. 通过视图pgxc_wlm_workload_records（动态负载功能开启，即enable_dynamic_workload为on时该视图有效）查询当前用户在每个CN上作业执行时的状态信息。 
   ```
   SELECT * FROM pgxc_wlm_workload_records;
   ```
   
   
 
