
# TopSQL查询示例
本章节以查询TPC-DS样例数据的作业为例，演示如何查看[实时TopSQL](https://support.huaweicloud.com/devg-dws/dws_04_0397.html)和[历史TopSQL](https://support.huaweicloud.com/devg-dws/dws_04_0398.html)。
#### 配置集群参数
查询TopSQL资源监控信息之前，需要先配置相关的GUC参数，以便能查询到作业的资源监控历史信息或归档信息。步骤如下：
1. 登录[DWS控制台](https://console.huaweicloud.com/dws)。
2. 在左侧导航栏中，单击**"集群 \> 集群列表"**。
3. 在集群列表中找到所需要的集群，单击集群名称，进入**"集群详情"**页面。
4. 单击"参数修改"页签，并在"参数列表"修改参数[resource_track_duration](https://support.huaweicloud.com/devg-dws/dws_04_0922.html#ZH-CN_TOPIC_0000001811490709__section347574425112)为合适的值，然后单击**"** **保存"**。
5. 在**"修改预览** **"** 窗口，确认修改无误后，单击**"保存"**。
 
#### TopSQL查询示例
本示例以TPC-DS样例数据为例。
1. 打开SQL客户端工具，连接到您的数据库。
2. 使用explain语句查询所要执行的SQL语句的预估代价，从而可以确定该SQL语句是否会进行资源监控。 
   默认执行代价大于[resource_track_cost](https://support.huaweicloud.com/devg-dws/dws_04_0922.html#ZH-CN_TOPIC_0000001811490709__section1089022732713)的查询才会进行资源监控，用户才可以查询到相关的资源监控信息。
   例如，执行如下语句查询该SQL语句的预估执行代价：
   ```
   SET CURRENT_SCHEMA = tpcds;
   EXPLAIN WITH customer_total_return AS
   ( SELECT sr_customer_sk as ctr_customer_sk,
   sr_store_sk as ctr_store_sk, 
   sum(SR_FEE) as ctr_total_return 
   FROM store_returns, date_dim
   WHERE sr_returned_date_sk = d_date_sk AND d_year =2000
   GROUP BY sr_customer_sk, sr_store_sk )
   SELECT  c_customer_id
   FROM customer_total_return ctr1, store, customer
   WHERE ctr1.ctr_total_return > (select avg(ctr_total_return)*1.2 
   FROM customer_total_return ctr2
   WHERE ctr1.ctr_store_sk = ctr2.ctr_store_sk) 
   AND s_store_sk = ctr1.ctr_store_sk
   AND s_state = 'TN'
   AND ctr1.ctr_customer_sk = c_customer_sk
   ORDER BY c_customer_id
   limit 100;
   ```
   查询结果如下所示，第一行的E-costs列的值即为当前语句的预估代价。
   图1explain查询结果   
   ![](https://support.huaweicloud.com/devg-dws/figure/zh-cn_image_0000001764651120.png "点击放大")
   本示例为了演示TopSQL的资源监控功能，需要将resource_track_cost参数设置为比explain查询结果中的预估代价小的一个值，即将resource_track_cost参数设置为100，设置方法请参见[resource_track_cost](https://support.huaweicloud.com/devg-dws/dws_04_0922.html#ZH-CN_TOPIC_0000001811490709__section1089022732713)。
   ![](https://support.huaweicloud.com/devg-dws/public_sys-resources/note_3.0-zh-cn.png)
   在完成本示例后，仍然要将[resource_track_cost](https://support.huaweicloud.com/devg-dws/dws_04_0922.html#ZH-CN_TOPIC_0000001811490709__section1089022732713)设置为原始的默认值100000或者一个比较合理的值，否则参数值太小会影响数据库性能。
   
   
3. 执行SQL语句。
   
   ```
   SET CURRENT_SCHEMA = tpcds;
   WITH customer_total_return AS
   (SELECT sr_customer_sk as ctr_customer_sk, 
   sr_store_sk as ctr_store_sk, 
   sum(SR_FEE) as ctr_total_return
   FROM store_returns,date_dim
   WHERE sr_returned_date_sk = d_date_sk
   AND d_year =2000
   GROUP BY sr_customer_sk ,sr_store_sk)
   SELECT  c_customer_id
   FROM customer_total_return ctr1, store, customer
   WHERE ctr1.ctr_total_return > (select avg(ctr_total_return)*1.2 
   FROM customer_total_return ctr2
   WHERE ctr1.ctr_store_sk = ctr2.ctr_store_sk)
   AND s_store_sk = ctr1.ctr_store_sk
   AND s_state = 'TN'
   AND ctr1.ctr_customer_sk = c_customer_sk
   ORDER BY c_customer_id
   limit 100;
   ```
   
   
4. 在SQL语句执行期间，查询该条SQL语句在当前CN上的Memory峰值的实时信息。 
   ```
   SELECT query,max_peak_memory,average_peak_memory,memory_skew_percent FROM gs_wlm_session_statistics ORDER BY start_time DESC;
   ```
   含义：查询**query** **级别** 的SQL语句的Memory峰值**实时信息**（语句在所有DN上的每秒最大Memory峰值，在所有DN上的每秒平均Memory峰值，在DN间的Memory倾斜率）
   实时TopSQL资源监控信息的更多查询示例，请参见[实时TopSQL](https://support.huaweicloud.com/devg-dws/dws_04_0397.html)。
   
   
5. 等待[3]中的SQL执行完成，然后查询该语句执行期间的资源监控历史信息。
   
   ```
   SELECT query,start_time,finish_time,duration,status FROM gs_wlm_session_history ORDER BY start_time desc;
   ```
   含义：查询**query** **级别** 的SQL语句执行期间的**历史信息**（语句执行的开始时间，结束时间，实际执行时间，执行状态），时间单位为ms。
   历史TopSQL资源监控信息的更多查询示例，请参见[历史TopSQL](https://support.huaweicloud.com/devg-dws/dws_04_0398.html)。
   
   
6. 等待[3]中的SQL执行结束的三分钟后，在info视图中查询该语句的资源监控历史信息。
   
   如果设置参数enable_resource_record为"on"，且[3]中SQL的执行时间不小于resource_track_duration所设置的值，该条语句的历史信息将会在三分钟后被归档到gs_wlm_session_info视图中。
   对于info视图，只支持在连接postgres数据库时查询。因此，请切换为连接postgres数据库后，再执行以下语句进行查询：
   ```
   SELECT query,start_time,finish_time,duration,status FROM gs_wlm_session_info ORDER BY start_time desc;
   ```
   
   
 
