Greenplum数据库统计信息——analyze命令

2023-03-27 00:00:00 函数 分析 采样 统计信息 流程

前面分享PostgreSQL数据库统计信息——analyze命令博客说明,这里就看一下Greenplum数据库统计信息analyze命令与PostgreSQL的差异。从gram.y文件中可以看出greenplum新增ROOTPARTITION/FULLSCAN选项(analyze verbose ROOTPARTITON relation_list;analyze verbose ROOTPARTITON ALL;analyze verbose FULLSCAN relation_list),其语法处理就是向VacuumStmt的options成员中添加makeDefElem(“rootpartition”, NULL, @3)或makeDefElem(“fullscan”, NULL, @3))。


ROOTPARTITION [ALL]用于基于分区表子表上的数据收集根分区上的统计信息。如果可能,ANALYZE使用叶子分区统计信息生成根分区统计信息。否则,ANALYZE通过对叶子分区数据进行采样来收集统计信息。ExecVacuum函数新增rootonly和fullscan两个bool变量用于处理上述新增options,并设置相应的params.options为VACOPT_ROOTONLY或VACOPT_FULLSCAN。VACOPT_ROOTONLY影响到expand_vacuum_rel函数和get_all_vacuum_rels函数,用于获取所有需要分析表列表时剔除子表或剔除父表(disable optimizer_analyze_root_partition)。
FULL SCAN就是利用SPI执行select pg_catalog.gp_hyperloglog_accum(columnname) from schemaName.RelationName as Ta以通过hyperloglog扩展的gp_hyperloglog_accum函数为整个表获取HLL counter值,并将计数值存放到统计信息的stahll_full字段中去。

| analyze_keyword opt_verbose ROOTPARTITION vacuum_relation_list
{
VacuumStmt *n = makeNode(VacuumStmt);
n->options = NIL;
if ($2)
n->options = lappend(n->options,
makeDefElem("verbose", NULL, @2));
n->options = lappend(n->options,
makeDefElem("rootpartition", NULL, @3));
n->rels = $4;
n->is_vacuumcmd = false;
$$ = (Node *)n;
}
| analyze_keyword opt_verbose ROOTPARTITION ALL
{
VacuumStmt *n = makeNode(VacuumStmt);
n->options = NIL;
if ($2)
n->options = lappend(n->options,
makeDefElem("verbose", NULL, @2));
n->options = lappend(n->options,
makeDefElem("rootpartition", NULL, @3));
n->rels = NIL;
n->is_vacuumcmd = false;
$$ = (Node *)n;
}
| analyze_keyword opt_verbose FULLSCAN vacuum_relation_list
{
VacuumStmt *n = makeNode(VacuumStmt);
n->options = NIL;
if ($2)
n->options = lappend(n->options,
makeDefElem("verbose", NULL, @2));
n->options = lappend(n->options,
makeDefElem("fullscan", NULL, @3));
n->rels = $4;
n->is_vacuumcmd = false;
$$ = (Node *)n;
}

以下差异为greenplum分布式统计信息收集,主要通过ctx来区分是QD还是QE在执行该段代码。



do_analyze_rel函数在postgresql中的主要流程如下。准备工作流程: 1. 创建anl_context内存上下文,并切换到该内存上下文中 2. 切换到表所有者的userid,以便任何索引函数都作为该用户运行 3. 需要进一步确定要分析一个表中的哪些列:用户可能指定只分析表中的某几个列,被频繁访问的列才更有被分析的价值,然后还要打开待分析表的所有索引,看看是否有可以被分析的。列采样工作流程: 1. 使用所有可分析列中的坏情况,确定需要采样的行数 2. 使用采样函数获取采样行 3. 计算统计数据。而greenplum的do_analyze_rel函数由于需要处理params.options为VACOPT_FULLSCAN的情况和分布式采样QE流程ctx不为null的流程,所以有相当的差异。


greenplum这里采用的acquire_sample_rows和acquire_inherited_sample_rows是分布式采样函数,而不是普通的采样函数。
统计信息计算流程和统计信息更新流程对hll统计信息做了相应的处理,如下所示。




本文来源:https://blog.csdn.net/asmartkiller/article/details/127329031

相关文章