# 诊断DWS的SQL执行语句
DWS提供了SQL诊断工具，通过诊断SQL查询语句给出该语句的告警信息和执行计划分析，识别出语句执行过程中的瓶颈。帮助用户优化SQL查询性能，提高数据库的查询效率，减少系统资源消耗，提高响应速度。
#### 前提条件
启动SQL诊断功能需要在**"监控设置\>监控采集"** 页面打开历史查询监控采集功能，操作详情请参见[监控采集](https://support.huaweicloud.com/mgtg-dws/dws_01_00135.html#ZH-CN_TOPIC_0000002617625279__zh-cn_topic_0000001076708691_section149871230683)。
#### 查看SQL诊断结果
1. [登录DWS管理控制台](https://console.huaweicloud.com/dws)。
2. 在**"集群 \> 集群列表"**页面，找到需要查看监控的集群。
3. 在指定集群所在行的**"操作"** 列，单击**"监控面板"**，系统将显示数据库监控页面。
4. 在左侧导航栏选择**"工具 \> SQL诊断"**，进入SQL诊断页面。
5. 在SQL诊断页面您可查看SQL的诊断信息。指标详情请参见[表1]。
   
   ![](https://support.huaweicloud.com/mgtg-dws/figure/zh-cn_image_0000002617505273.png "点击放大")
    表1SQL诊断指标说明 
   | 指标名称     | 指标说明                                                                                                                                                                                                                                                                                                                                                                                                                                       |
   |:---|:---|
   | 查询ID   | 语句执行使用的内部query_ID。                                                                                                                                                                                                                                                                                                                                                                                                                            |
   | 数据库       | 所属数据库名称。                                                                                                                                                                                                                                                                                                                                                                                                                                   |
   | 模式名       | 所属模式名称。                                                                                                                                                                                                                                                                                                                                                                                                                                   |
   | 用户名称     | 所属用户名称。                                                                                                                                                                                                                                                                                                                                                                                                                                     |
   | 客户端    | 连接到后端的应用名。                                                                                                                                                                                                                                                                                                                                                                                                                                   |
   | 客户端IP地址   | 连接到后端的客户端的IP地址。 如果此字段是null，它表明通过服务器机器上UNIX套接字连接客户端或者是内部进程，如autovacuum。                                                                                                                                                                                                                                                                                                                                                                    |
   | 运行时间（ms）  | 语句实际执行的时间，单位：毫秒。                                                                                                                                                                                                                                                                                                                                                                                                                           |
   | CPU时间（ms） | 语句在所有DN上的CPU总时间，单位：毫秒。                                                                                                                                                                                                                                                                                                                                                                                                                       |
   | 开始时间   | 语句执行开始时间。                                                                                                                                                                                                                                                                                                                                                                                                                                  |
   | 完成时间     | 语句执行结束时间。                                                                                                                                                                                                                                                                                                                                                                                                                                 |
   | 详情       | 单击**"查看"**键，可浏览到SQL的详细诊断结果。其中包括： - 告警信息：该SQL语句的告警信息。  - SQL语句：该SQL语句。  - 执行计划：该SQL语句的执行计划分析。   |
      
   
   
 
 #### 相关GUC参数设置
SQL诊断指标采集的相关GUC参数如下，具体请参见《数据仓库服务开发指南》中"GUC参数"章节：
表2SQL诊断相关GUC参数 
| GUC参数名                        | 取值范围             | 默认值     | DMS期望值      | 作用                                                                                                                                                                                                                                                                                                                                 |
|:---|:---|:---|:---|:---|
| enable_resource_track        | 布尔型                 | on     | on（仅供参考）     | 控制是否开启资源实时监控功能。 仅开启该参数，但没有正确配置其他相关联GUC参数，将不能记录实时资源消耗情况。                                                                                                                                                                                                                            |
| resource_track_cost          | 整型，-1\~INT_MAX    | 0        | 0（仅供参考）     | 设置对当前会话的语句进行资源监控的最小执行代价，该参数只有当参数enable_resource_track为on时才有效。 当该值设置过小，会导致更多的语句被记录，引起记录膨胀，记录过程也会影响集群性能。                                                                                                                                                                              |
| resource_track_level        | 枚举类型              | query | query（仅供参考） | 设置当前会话的资源监控的等级；该参数只有当参数enable_resource_track为on时才有效。 设置operator级别的资源监控会显著影响性能。                                                                                                                                                                                                     |
| resource_track_duration       | 整型，0\~INT_MAX，单位为秒 | 60     | 0（仅供参考）      | 设置资源监控实时视图中记录的语句执行结束后进行历史信息转存的最小执行时间。即，只有当执行时间超过该时间的语句才会被记入到历史视图中。该参数只有当enable_resource_track为on时才有效。 当该值设置的过小，会导致内核语句转存的批处理机制失效，对内核性能产生影响。                                                                                                                                           |
| topsql_retention_time  | 整型，0\~3650，单位为天   | 30      | 14（仅供参考）     | 视图pgxc_wlm_session_info数据老化时间。 该时间设置为0时表示不会老化，这会导致存储膨胀。                                                                                                                                                                                                                             |
| enable_resource_record         | 布尔型             | on     | on（仅供参考）    | 是否开启资源监控记录归档功能；开启时，对于history视图（GS_WLM_SESSION_HISTORY和GS_WLM_OPERATOR_HISTORY）中的记录，每隔3分钟会分别被归档到相应的info视图（GS_WLM_SESSION_INFO和GS_WLM_OPERATOR_INFO），归档后history视图中的记录会被清除。 开启该功能时建议同时设置合适的topsql_retention_time参数值配置老化时间。否则，将会引起GS_WLM_SESSION_INFO或GS_WLM_OPERATOR_INFO表的数据膨胀。  |
   
#### 常见问题
**问题现象**
用户的SQL语句执行时间长，消耗资源多。
**定位思路**
如果用户的SQL语句在执行时存在效率问题，内核执行后给出优化建议。用户通过查询SQL语句的执行历史，检索出优化建议，进一步优化SQL语句的编写，提高集群的查询效率。
**解决步骤**
1. 查看**"SQL诊断"**页面，选择可疑的时间段。
2. 根据SQL的开始时间，结束时间，运行时间等指标检索SQL语句。
3. 单击详情**"查看"**，打开详情页面，进一步查看SQL优化建议。
4. 根据具体优化建议，优化SQL语句。
 
