手动收集统计信息

统计信息记录了数据库表中元数据的相关信息。查询优化器需要根据最新的统计信息,优化并执行查询计划,以提高数据库的性能。本文为您介绍在云原生数据仓库AnalyticDB PostgreSQL版数据库中如何使用ANALYZE命令手动收集统计信息。

适用场景

手动收集统计信息,无需频繁使用。可在满足以下条件时,手动执行ANALYZE命令收集统计信息。

  • 表中超过20%数据更新(INSERTUPDATEDELETE)或创建索引后,需手动收集统计信息。

  • ETL任务过程中,会涉及多次INSERTUPDATEDELETE,可根据实际情况,适当添加ANALYZE语句以手动收集统计信息。

  • 新建的表(包含函数或存储过程)写入数据后,可根据实际情况,适当添加ANALYZE语句以手动收集统计信息。

  • 调优过程中,从执行计划中看到表行数估算为1行,计划中出现较多的Broadcast、Sort+GroupByAgg、NestLoop等算子时,考虑对相应数据表进行手动收集统计信息。

ANALYZE用法

云原生数据仓库AnalyticDB PostgreSQL版数据库使用ANALYZE命令收集统计信息。

语法

ANALYZE [VERBOSE] [ROOTPARTITION ALL|[table [(column[, ... ])]] ]
说明

ANALYZE可单独使用。单独使用时为数据库中所有的表收集统计信息。该方式运行时间可能会比较久。

参数说明

  • VERBOSE:打印ANALYZE执行过程中扫描行数、可见行数等统计信息。如果不含此参数将不打印统计信息。

  • ROOTPARTITION ALL|[table [(column[, ... ])]]:对分区表的主表触发收集统计信息。

    • ROOTPARTITION ALL:对当前数据库下所有分区表的主表触发收集统计信息。

    • ROOTPARTITION [table]:对某张分区表的主表触发收集统计信息。

    • 如果不含ROOTPARTITION,对分区主表执行ANALYZE时,则会对分区子表也执行统计信息。

  • table[(column1, column2, ...)]:对某张表的若干列收集统计信息。如果不写列名,默认为整张表的所有列收集统计信息。为减少ANALYZE执行时间,您可以只对用JOINWHERESORTGROUP BY或者HAVING涉及的列收集统计信息。此时运行ANALYZE需要指定表的名称和列的名称作为参数,例如:ANALYZE t1(a, b)

使用示例

对orders表的o_orderdate列和o_orderpriority列收集统计信息。

ANALYZE orders(o_orderdate, o_orderpriority);