
# SQL自诊断
用户在执行查询或者执行INSERT/DELETE/UPDATE/CREATE TABLE AS语句时，可能会遇到性能问题。
SQL自诊断的告警类型与GUC参数resource_track_level的设置有关系。如果resource_track_level设置为query，则可以诊断多列/单列统计信息未收集和SQL不下推的告警。如果resource_track_level设置为operator，则可以诊断所有的告警场景。
SQL自诊断的诊断范围与GUC参数resource_track_cost的设置有关系。当SQL的代价大于resource_track_cost时，SQL才会被诊断。SQL的代价可以通过explain来确认。
SQL自诊断功能受enable_analyze_check参数影响，使用前应确认该开关已打开。
执行语句较多时，可能会由于内存管控导致部分数据无法收集，可以尝试将instr_unique_sql_count设置值调高。
#### 告警场景
目前支持对以下7种导致性能问题的场景上报告警。
- 多列/单列统计信息未收集 如果存在单列或者多列统计信息未收集，则上报相关告警。
  告警信息示例：
  整表的统计信息未收集：
  ```
  Statistic Not Collect:
      schema_test.t1
  ```
  单列统计信息未收集：
  ```
  Statistic Not Collect:
      schema_test.t2(c1,c2)
  ```
  多列统计信息未收集:
  ```
  Statistic Not Collect:
      schema_test.t3((c1,c2))
  ```
  单列和多列统计信息未收集：
  ```
  Statistic Not Collect:
      schema_test.t4(c1,c2)    schema_test.t4((c1,c2))
  ```
  

- SQL不下推
  对于不下推的SQL，尽可能详细上报导致不下推的原因。调优方法请参见[语句下推调优](https://support.huaweicloud.com/distributed-devg-v8-gaussdb/gaussdb-12-0264.html#ZH-CN_TOPIC_0000002527985872)。
  - 对于因函数而导致的不下推，会告警对应的函数信息。
  
  - 对于不支持下推的语法，会告警对应语法不支持下推，例如：含有With Recursive、Distinct On、row表达式和返回值为record类型的，会告警相应语法不支持下推等。
   
  告警信息示例：
  ```
  SQL is not plan-shipping, reason : "With Recursive" can not be shipped"
  SQL is not plan-shipping, reason : "Function now() can not be shipped"
  SQL is not plan-shipping, reason : "Function string_agg() can not be shipped"
  ```
  

- HashJoin中大表做内表 如果在表连接过程中使用了Hashjoin，且连接的内表行数是外表行数的10倍或以上，同时内表在每个DN上的平均行数大于10万行，且发生了下盘，则上报相关告警。调优方法请参见[使用plan hint调优执行计划](https://support.huaweicloud.com/distributed-devg-v8-gaussdb/gaussdb-12-0271.html#ZH-CN_TOPIC_0000002527985876)。
  告警信息示例：
  ```
  PlanNode[7] Large Table is INNER in HashJoin “Vector Hash Aggregate”
  ```
  

- 大表等值连接使用Nestloop 如果在表连接过程中使用了nestloop，并且两个表中较大表的行数平均每个DN上的行数大于10万行，表的连接中存在等值连接，则上报相关告警。调优方法请参见[使用plan hint调优执行计划](https://support.huaweicloud.com/distributed-devg-v8-gaussdb/gaussdb-12-0271.html#ZH-CN_TOPIC_0000002527985876)。
  告警信息示例：
  ```
  PlanNode[5] Large Table with Equal-Condition use Nestloop"Nested Loop"
  ```
  

- 大表Broadcast 如果在Broadcast算子中，平均每DN的行数大于10万行，则告警大表broadcast。调优方法请参见[使用plan hint调优执行计划](https://support.huaweicloud.com/distributed-devg-v8-gaussdb/gaussdb-12-0271.html#ZH-CN_TOPIC_0000002527985876)。
  告警信息示例：
  ```
  PlanNode[5] Large Table in Broadcast "Streaming(type: BROADCAST dop: 1/2)"
  ```
  

- 数据倾斜 某表在各DN上的分布，存在某DN上的行数是另一DN上行数的10倍或以上，且有DN中的行数大于10万行，则上报相关告警。
  告警信息示例：
  ```
  PlanNode[6] DataSkew:"Seq Scan", min_dn_tuples:0, max_dn_tuples:524288
  ```
  

- 估算不准 如果优化器的估算行数和实际行数中的较大值平均每DN行数大于10万行，并且估算行数和实际行数中较大值是较小值的10倍或以上，则上报相关告警。调优方法请参见[使用plan hint调优执行计划](https://support.huaweicloud.com/distributed-devg-v8-gaussdb/gaussdb-12-0271.html#ZH-CN_TOPIC_0000002527985876)。
  告警信息示例：
  ```
  PlanNode[5] Inaccurate Estimation-Rows: "Hash Join" A-Rows:0, E-Rows:52488
  ```
  
 
#### 规格约束
1. 告警字符串长度上限为2048。如果告警信息超过这个长度（例如存在大量未收集统计信息的超长表名、列名等信息）则不告警，只上报warning：
   ```
   WARNING, "Planner issue report is truncated, the rest of planner issues will be skipped"
   ```
   
2. 如果query存在limit节点（即查询语句中包含limit），则不会上报limit节点以下的Operator级别的告警。
3. 对于"数据倾斜"和"估算不准"两种类型告警，在某一个plan树结构下，只上报下层节点的告警，上层节点不再重复告警。主要是因为这两种类型的告警可能是因为底层触发上层的。例如，如果在scan节点已经存在数据倾斜，那么在上层的hashagg等其他算子很可能也出现数据倾斜。
 
