1、以如下SQL语句为例:
select d, avg(a::numeric(7, 2)) from t_distinct group by d;
2、执行EXPLAIN的输出为:
gaussdb=# explain select d, avg(a::numeric(7, 2)) from t_distinct group by d; id | operation | E-rows | E-width | E-costs ----+---------------------------------------------------+--------+---------+--------- 1 | -> Row Adapter | 20 | 40 | 14.52 2 | -> Vector Streaming (type: GATHER) | 20 | 40 | 14.52 3 | -> Vector Hash Aggregate | 20 | 40 | 13.59 4 | -> Vector Streaming(type: REDISTRIBUTE) | 20 | 8 | 13.33 5 | -> CStore Scan on t_distinct | 20 | 8 | 13.01 (5 rows)
3、执行计划字段解读(横向):
1)id:执行算子节点编号。
2)operation:具体的执行节点算子名称。
Vector前缀的算子是指向量化执行引擎算子,一般出现含有列存表的Query中。
Streaming是一个特殊的算子,它实现了分布式架构的核心数据shuffle功能,Streaming共有三种形态,分别对应了分布式结构下不同的数据shuffle功能:
(1)Streaming (type: GATHER):作用是coordinator从DN收集数据。
(2)Streaming(type: REDISTRIBUTE):作用是DN根据选定的列把数据重分布到所有的DN。
(3)Streaming(type: BROADCAST):作用是把当前DN的数据广播给其他所有的DN
3)E-rows:每个算子估算的输出行数。
4)E-memory:DN上每个算子估算的内存使用量,只有DN上执行的算子会显示。某些场景会在估算的内存使用量后使用括号显示该算子在内存资源充足下可以自动扩展的内存上限。
5)E-width:每个算子输出元组的估算宽度。
6)E-costs:每个算子估算的执行代价。
(1)E-costs是优化器根据成本参数定义的单位来衡量的,习惯上以磁盘页面抓取为1个单位, 其它开销参数将参照它来设置。
(2)每个节点的开销(E-costs值)包括它的所有子节点的开销。
(3)开销只反映了优化器关心的东西,并没有把结果行传递给客户端的时间考虑进去。虽然这个时间可能在实际的总时间里占据相当重要的分量,但是被优化器忽略了,因为它无法通过修改规划来改变。




