手动收集统计信息
统计信息记录了数据库表中元数据的相关信息。查询优化器需要根据最新的统计信息,优化并执行查询计划,以提高数据库的性能。本文为您介绍在云原生数据仓库AnalyticDB PostgreSQL版数据库中如何使用ANALYZE
命令手动收集统计信息。
适用场景
手动收集统计信息,无需频繁使用。可在满足以下条件时,手动执行ANALYZE
命令收集统计信息。
表中超过20%数据更新(
INSERT
、UPDATE
或DELETE
)或创建索引后,需手动收集统计信息。ETL任务过程中,会涉及多次
INSERT
、UPDATE
或DELETE
,可根据实际情况,适当添加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
执行时间,您可以只对用JOIN
、WHERE
、SORT
、GROUP BY
或者HAVING
涉及的列收集统计信息。此时运行ANALYZE
需要指定表的名称和列的名称作为参数,例如:ANALYZE t1(a, b)
。
使用示例
对orders表的o_orderdate列和o_orderpriority列收集统计信息。
ANALYZE orders(o_orderdate, o_orderpriority);