更新统计信息
要获得良好的查询性能,准确的统计信息准确十分重要。通过使用 ANALYZE
语句更新统计信息,可以使查询优化器生成最优的查询计划。Apache Cloudberry 对表进行分析时,相关的数据信息被存储在系统目录表中。如果存储的信息过时了,查询优化器可能会生成低效的查询计划。
查看统计信息是否已更 新
要查看一张表的统计信息是否是最新的,可以使用 pg_stat_all_tables
系统视图。这个视图中的 last_analyze
列显示该表最近一次被分析的时间,而 last_autoanalyze
列显示该表最近一次被自动分析的时间。执行 ANALYZE
语句时,这两列的时间信息都会被更新。
例如,要检查 test_analyze
表的统计信息是否已更新,可以执行以下查询:
SELECT schemaname, relname, last_analyze, last_autoanalyze
FROM pg_stat_all_tables
WHERE relname = 'test_analyze';
有选择地生成统计信息
不带任何参数执行 ANALYZE
语句会更新数据库中所有表的统计信息。这是一个非常耗时的过程,不推荐这样操作。建议在数据发生变化时,选择性地对表执行 ANALYZE
,或者使用 analyzedb 工具。
对大表执行 ANALYZE
可能需要很长时间。如果无法对大表的所有列执行 ANALYZE
,可以仅针对特定列使用 ANALYZE table(column, ...)
来生成统计信息。确保在这些条件中使用的列被包含在内:连接、WHERE
子句、SORT
子句、GROUP BY
子句或 HAVING
子句。
对于分区表,可以仅对发生变化的分区执行 ANALYZE
,例如,添加新分区时。请注意,对于分区表,可以在根分区表或叶分区(实际存储数据和统计信息的文件)上执行 ANALYZE
。在 Apache Cloudberry 中,对分区表的单个分区执行 ANALYZE
还会 更新根表的统计信息,这表明对一个分区进行统计信息收集可能会影响整个分区表的优化器统计信息。使用 pg_partition_tree()
函数可以找到叶分区的名称。
SELECT * FROM pg_partition_tree( 'parent_table' );