收集根分区统计信息
对于分区表,GPORCA使用表根分区的统计信息来生成查询计划。这些统计信息用于确定联接顺序、拆分和联接聚合节点以及计算查询步骤的成本。相比之下,Postgres规划器使用每个叶分区的统计信息。
如果在分区表上执行查询,应收集根分区的统计信息,并定期更新这些统计信息,以确保gporca能够生成最佳查询计划。如果根分区统计信息不是最新的或不存在,gporca仍然对表的查询执行动态分区消除。但是,查询计划可能不是最佳的。
Parent topic: 关于GPORCA
运行ANALYZE
默认情况下,在分区表的根分区上运行ANALYZE命令将对表中的叶分区数据进行采样, 并存储根分区的统计信息。ANALYZE 收集根分区和叶分区的统计信息,包括HyperLogLog (HLL)统计信息。ANALYZE ROOTPARTITION 只收集根分区上的统计信息。服务器配置参数optimizer_analyze_root_partition控制是否需要ROOTPARTITION关键字来收集分区表根分区的根统计信息。有关收集分区表统计信息的信息,请参阅ANALYZE命令。 .
记住,在更新根分区统计信息之前,ANALYZE总是扫描整个表。如果您的表非常大,则此操作可能需要大量时间。ANALYZE ROOTPARTITION还使用一个访问ACCESS SHARE锁,用于在执行期间阻止某些操作,如TRUNCATE和VACUUM操作。 出于这些原因,您应该定期或者当叶分区数据发生重大更改时进行ANALYZE操作。
按照以下最佳实践在系统中分区表上运行ANALYZE或ANALYZE ROOTPARTITION :
- 运行ANALYZE
在一个新的分区表中添加初始数据后。运行ANALYZE 在新的叶分区或数据已更改的叶分区上。默认情况下,如果其他叶分区具有统计信息,则在叶分区上运行命令将更新根分区统计信息。 - 当您在表的EXPLAIN查询计划中发现查询性能衰退,或者在叶分区数据发生重大更改之后,更新根分区统计信息。 例如,如果在生成根分区统计信息后的某个时刻添加新的叶子分区,请考虑运行ANALYZE或ANALYZE ROOTPARTITION以使用从新叶子分区插入的新元组更新根分区统计信息。
- 对于非常大的表,只需每周运行ANALYZE或ANALYZE ROOTPARTITION,或者以长于每天的更新时间间隔运行。
- 避免在没有参数的情况下运行ANALYZE,因为这样做会对所有数据库表(包括分区表)执行命令。对于大型数据库,这些全局ANALYZE操作很难监控,并且很难预测完成所需的时间。
- 如果您的I/O吞吐量能够支持负载,可以考虑并行运行多个ANALYZE
或ANALYZE ROOTPARTITION
操作来加速统计数据收集的操作。
- 还可以使用Greenplum数据库实用程序analyzedb更新表统计信息。使用analyzedb确保如果没有对叶分区进行任何修改,则不会重新分析以前分析过的表。
GPORCA和叶分区统计信息
尽管创建和维护根分区统计信息对于分区表的GPORCA查询性能至关重要,但是维护叶分区统计信息也很重要。 如果GPORCA无法针对分区表生成查询计划,则使用传统查询优化器,需要叶分区统计信息来为该查询生成最佳计划。
GPORCA本身也将叶分区统计信息用于直接访问叶分区的任何查询,而不是使用带有谓词的根分区来消除分区。 例如,如果知道哪些分区包含查询所需的元组,则可以直接查询叶分区表本身;在这种情况下,GPORCA使用叶分区统计信息。
禁用自动根分区统计信息收集
如果不打算使用GPORCA对分区表执行查询(设置服务器配置参数optimizer为off),然后你可以禁用自动收集分区表的根分区的统计信息。服务器配置参数optimizer_analyze_root_partition控制是否需要 ROOTPARTITION关键字来收集分区表根分区的根统计信息。参数的默认设置为on,ANALYZE命令可以在不使用ROOTPARTITION关键字的情况下收集根分区统计信息。通过将参数设置为off,可以禁用根分区统计信息的自动收集。当该值为off时,必须运行ANALZYE ROOTPARTITION来收集根分区统计信息。
- 以数据库管理员,比如gpadmin的身份登录Greenplum数据库master主机。
设置服务器配置参数的值。这些Greenplum数据库gpconfig实用程序命令将参数值设置为off:
$ gpconfig -c optimizer_analyze_root_partition -v off --masteronly
重启Greenplum数据库。这个实用程序命令gpstop在不关闭Greenplum数据库的情况下重新加载master和segments的postgresql.conf文件。