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