
# 分析表
执行计划生成器需要使用表的统计信息，以生成最有效的查询执行计划，提高查询性能。因此数据导入完成后，建议执行ANALYZE语句生成最新的表统计信息。统计结果存储在系统表PG_STATISTIC中。
#### 分析表
ANALYZE支持的表类型有行/列存表、HDFS表、ORC/CARBONDATA格式的OBS外表。ANALYZE同时也支持对本地表的指定列进行信息统计。
以表product_info为例，ANALYZE命令如下：
```
ANALYZE product_info;
```
#### 表自动分析
DWS提供了三种场景下表的自动分析。
- 当查询中存在"统计信息完全缺失"或"修改量达到analyze阈值"的表，且执行计划不采取FQS（Fast Query Shipping）执行时，则通过GUC参数autoanalyze控制此场景下表统计信息的自动收集。此时，查询语句会等待统计信息收集成功后，生成更优的执行计划，再执行原查询语句。
- 当autovacuum设置为on时，系统会定时启动autovacuum线程，对"修改量达到analyze阈值"的表在后台自动进行统计信息收集。
  表1表自动分析 
  | 触发方式 | 触发条件             | 触发频率             | 控制参数                                | 备注                  |
  |:---|:---|:---|:---|:---|
  | 同步   | 统计信息完全缺失         | 查询时              | autoanalyze                         | truncate主表时会清空统计信息。 |
  | 同步   | 数据修改量达到analyze阈值 | 查询时              | autoanalyze                         | 先触发analyze，后选择最优计划。 |
  | 异步   | 数据修改量达到analyze阈值 | autovacuum线程轮询检查 | autovacuum_mode, autovacuum_naptime | 2s等锁超时, 5min执行超时。   |
     
  
![](https://support.huaweicloud.com/migration-dws/public_sys-resources/notice_3.0-zh-cn.png)
- autoanalyze只支持默认采样方式，不支持百分比采样方式。
- 多列统计信息仅支持百分比采样，因此autoanalyze不收集多列统计信息。
- 查询过程因表的"统计信息完全缺失"和"修改量达到analyze阈值"而自动触发autoanalyze的场景，当前不支持对外表触发autoanalyze，不支持对带有ON COMMIT \[DELETE ROWS \| DROP\]选项的临时表触发autoanalyze。
- 修改量达到analyze阈值是指：表的修改量超过autovacuum_analyze_threshold + autovacuum_analyze_scale_factor \* reltuples，其中reltuples是pg_class中记录的表的估算行数。
- 基于定时启动的autovacuum线程触发的autoanalyze，仅支持行存表和列存表，不支持外表、HDFS表、OBS外表、临时表、unlogged表和toast表。
- 查询时触发analyze会对分区表的所有分区加四级锁，直到查询所在事务提交后才会放锁。四级锁不堵塞增删改查，但会堵塞分区的修改操作，比如分区的truncate，可以通过将object_mtime_record_mode设置为disable_partition，实现提前释放分区锁。
- autovacuum自动清理功能的生效还依赖于下面两个GUC参数：
  - track_counts参数需要设置为on，开启收集数据库统计数据功能。
  
  - autovacuum_max_workers参数需要大于0，该参数表示能同时运行的自动清理线程的最大数量。
   
 
