当前位置: 首页 > news >正文

揭秘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计算。得到代价后,还会加上最后向量转行的代价:每条向量转换行的代价vecToRowCost=0.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.jsqmd.com/news/600099/

相关文章:

  • 2026跨平台开发打通三端生态实战选型指南
  • 硬件发烧友玩法:多GPU分配OpenClaw调用Qwen3-32B
  • Golang testing如何写单元测试_Golang单元测试教程【必看】
  • 保姆级教程:在RViz中一键搞定Cartographer机器人重定位(附避坑指南)
  • 从传感器选型到产品落地:跟着Autoware.universe的技术栈,聊聊智驾工程师的‘十八般武艺’
  • OpenClaw代码审查:Qwen3-4B-Thinking-2507-GPT-5-Codex-Distill-GGUF分析Git提交并生成改进建议
  • SG90舵机与STM32的PWM驱动实战指南
  • 2026年4月成都高空外墙清洗公司推荐:外墙清洗保洁/外墙高空清洗服务/幕墙外墙清洗公司/幕墙漏水维修/选择指南 - 优质品牌商家
  • GNSS定位精度提升秘籍:深入理解RTKLIB中的PCO与PCV修正原理
  • OpenClaw效率翻倍:Qwen2.5-VL-7B批量处理100+图片报告
  • libEGL.so和libGLESv2.so软链接失效?手把手教你修复树莓派上的QT程序警告
  • Java限流神器:手写一个通用限流任务执行器,支持重试和指数退避!
  • CenterPoint实战:基于热力图的3D目标检测与跟踪全解析
  • macOS下OpenClaw排错指南:Qwen3.5-9B-AWQ-4bit接口连接失败处理
  • 2026年4月汽车维修erp系统品牌推荐指南:汽车维修公司管理系统/汽车维修厂管理系统/汽车维修服务管理系统/选择指南 - 优质品牌商家
  • 2026年知名的深圳仓储货架可靠供应商推荐 - 品牌宣传支持者
  • 从NuttX到OpenVela:小米开源RTOS的跨平台兼容性到底有多强?(ARM/RISC-V实测)
  • 手把手教你用EMQX 5.x和花生壳内网穿透,5分钟搞定个人MQTT调试服务器
  • Codesys 3.5报警功能配置避坑指南:从报警组到确认方式,一次讲透
  • 华为DRS+UGO工具链详解:Oracle迁GaussDB的全自动化实践指南
  • 【fastadmin】自定义批量操作与Excel导入:高效管理多管理员分组策略
  • OpenClaw二次开发:为Qwen3.5-9B增加区域截图分析
  • 5分钟搞定OpenClaw镜像体验:千问3.5-35B-A3B-FP8云端沙盒部署
  • 3分钟搞定WebGL GPU性能测试:手把手教你用Canvas实现动态色彩渲染
  • OpenClaw移动适配:通过飞书远程调用Qwen2.5-VL-7B处理手机截图
  • 你的单波段图不只一种颜色:解锁QGIS隐藏技能,把灰度数据玩出RGB花样
  • 51单片机汇编实战:外部存储器与IO口扩展技术详解
  • arXiv提交前必读:如何选择最适合的许可证与格式要求
  • 从‘Resource temporarily unavailable’聊起:给Linux C/C++新手的EAGAIN避坑指南与心智模型
  • 告别手动操作!手把手教你用影刀RPA+钉钉机器人打造自动化工作流(附完整配置截图)