揭秘openGauss向量化执行引擎代价模型
揭秘openGauss向量化执行引擎代价模型openGauss的向量化执行引擎针对列存生成执行计划后根据配置项是否开启直接决定是否将执行计划转换成向量化执行计划来执行。若向量化执行引擎在行存上执行就需要将数据转换成VectorBatch即列存的形式才可执行这个转换就有代价。当向量化执行的优势没有被转换代价吃掉时行存上使用向量化执行引擎才有意义。openGauss3.0针对行存引入对向量化执行引擎的支持。通过向量化代价来估算执行计划转换是否合适。1、代价模型代价模型如下图所示它基于一个基础的代价参数体系在此基础上计算表达式计算代价、扫描代价然后层层递进计算整个执行计划的向量化代价根据向量化计划代价和普通计划代价选择合适的执行计划。openGauss仅对Agg、HashJoin、Nestloop join以及扫描包括SeqScan顺序扫描、IndexScan索引扫描、AnnIndexScan向量索引扫描、BitmapHeapScan、TidScan、FunctionScan、ForeignScan算子进行向量化代价计算其他算子认为和普通算子的代价一样。也就是这些算子的子算子输出的是行格式数据到这些算子后需要转换成向量进行计算的代价。当然该代价模型针对的是有行存表的情况如果都是列存表则不进行该代价计算。2、代码入口入口函数是try_vectorize_plan将普通执行计划转换成向量化执行计划。配置项try_vector_engine_strategy为force或者optimal并且扫描对象有列存时才会进行代价计算否则直接返回原执行计划树然后调用vector_engine_walker遍历执行计划树计算代价vector_engine_walker中遍历执行计划前会将行式引擎的代价和向量引擎的代价设置成0然后进入vector_engine_walker_internal计算。得到代价后还会加上最后向量转行的代价每条向量转换行的代价vecToRowCost0.2然后再放大1.2倍vector_engine_walker_internal的关键向量化代价计算算子如下3、CostVectorScan基础的行扫描代价为1向量扫描代价为0.9行转向量的代价为0.7。顺序扫描下1非向量代价估算的表行数*扫描一行的代价(1)过滤代价投影代价2向量化代价估算的表行数*扫描一行的代价(0.9)过滤代价过滤列转换代价投影代价投影列排除过滤列的转换代价过滤和投影的代价由函数VectorEngineCheckExpressionInternal完成根据过滤的列和投影列表做出代价计算注意各个表达式计算的基准代价值对于非顺序扫描1非向量代价估算的索引扫描行数*扫描一行的代价(1)过滤代价投影代价2向量化代价过滤代价投影代价行扫描代价行转向量代价planContext-vecCost origVecCost planContext-rowCost - origRowCost;planContext-vecCost rowToVecTransCost * exprContext.rows * list_length(scanPlan-plan.targetlist);4、CostVectorAgg聚合的向量化代价注意聚焦在投影和过滤上因为聚合操作都在投影列表所以依据子算子输出的行数进行代价计算5、CostVectorHashJoin向量化hashjoin的代价包括内部hash key列和join列以及null比较列的代价探测的代价投影列的代价6、CostVectorNestJoin向量化的代价包括join和null列的代价投影列的代价
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2491206.html
如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!