更新时间:2024-11-05 GMT+08:00

分析表

执行计划生成器需要使用表的统计信息,以生成最有效的查询执行计划,提高查询性能。因此数据导入完成后,建议执行ANALYZE语句生成最新的表统计信息。统计结果存储在系统表PG_STATISTIC中。

分析表

ANALYZE支持的表类型有行/列存表、HDFS表、ORC/CARBONDATA格式的OBS外表。ANALYZE同时也支持对本地表的指定列进行信息统计。

以表product_info为例,ANALYZE命令如下:
1
ANALYZE product_info;

表自动分析

GaussDB(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执行超时。

  • 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,该参数表示能同时运行的自动清理线程的最大数量。