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

Starrocks ShortCircuit短路径的调度

背景

本文基于Starrocks 3.3.5
在之前的Starrocks 的 ShortCircuit短路径中我们谈到过,基于点查的这种ShortCircuit短路径
在优化器上不会经过复杂的优化,更不会经过memo的CBO优化,这一点也是为什么点查会快。
而且在之前的文章中,也没说看到有规则判断点查必须是要求行存,实际中在Starrocks中列存和行列存储都是可以进行点查操作的(每个引擎不一样,当然效果也就不一样).

结论

任何一个SQL计算存储引擎,有两个组件必然是有的:一个是 调度模块,另一个是 SQL优化模块
一个SQL被优化优化了以后(当然还有其他流程),就会由调度模块进行task的调度,这样才能进行实实在在的运行。
而且这里的调度分两种,一种是 Pipline调度,一种是stagebyStage调度
对于Starrocks来说,默认是前者,也就是 Pipeline调度,而且调度的模式不一样,任务并行度的设置也不一样:
当设置 set enable_pipeline_engine = true(默认) 时,影响并行度的参数是 pipeline_dop 当设置 set enable_pipeline_engine = false 时,影响并行度的参数是 parallel_fragment_exec_instance_num
而对于点查来说,直接跳过调度层级(由于是查询,几乎不会有其他的计算),直接再BE获取数据即可。
而如果是行存的话,直接通过PK获取一行数据,
如果是列存的话,通过PK,因为一行数据是存储崽不通的列chunk(Column Chunk)中,所以会通过多轮的数据获取,之后再组装成一行数据,所以消耗的时间就多了。

分析

先说说数据流:

StmtExecutor.execute||\/
StatementPlanner.plan||\/
handleQueryStmt||\/
DefaultCoordinator.startScheduling

这里的startScheduling 方法就是fragemnt任务的调度:

@Override
public void startScheduling(boolean needDeploy) throws Exception {try (Timer timer = Tracers.watchScope(Tracers.Module.SCHEDULER, "Pending")) {QueryQueueManager.getInstance().maybeWait(connectContext, this);}if (isShortCircuit) {execShortCircuit();return;}try (Timer timer = Tracers.watchScope(Tracers.Module.SCHEDULER, "Prepare")) {prepareExec();}try (Timer timer = Tracers.watchScope(Tracers.Module.SCHEDULER, "Deploy")) {deliverExecFragments(needDeploy);}// Prevent `explain scheduler` from waiting until the profile timeout.if (!needDeploy) {queryProfile.finishAllInstances(Status.OK);}
}

可以看到 如果是短路径的话(也就是点查),直接进入到execShortCircuit 方法,从而调用ShortCircuitHybridExecutor.exec方法,这里就直接向BE请求数据了,
反观,如果不是短路径,则还会经过
prepareExec
deliverExecFragments
两个阶段,
这里包括DAG的构建,fragment的具体Deploy(具体哪个BE上分配哪些Task),以及等待部署成功等等,这些都是要需要时间的。
所以说如果一个query过来的话,不是点查,但是SQL查询比较简单的话,也许真正查询的时间少,但是在调度Fragment的时间却比较多。

http://www.dtcms.com/a/312632.html

相关文章:

  • c++类和对象(0基础也能懂)
  • ThinkPHP8学习篇(一):安装与配置
  • 力扣 hot100 Day64
  • Unity_数据持久化_XML序列化与反序列化
  • 设计模式学习[17]---组合模式
  • Android 之 RxJava2
  • 电商系统定制开发流程:ZKmall开源商城需求分析到上线全程可控
  • Node.js (Express) + MySQL + Redis构建项目流程
  • C++ 入门基础(3)
  • 从零开始学Express,理解服务器,路由于中间件
  • Ubuntu20.04 Carla安装与和Ros联合仿真
  • OpenCV轻松入门_面向python(第一章OpenCV入门)
  • Kafka——怎么重设消费者组位移?
  • 北京-4年功能测试2年空窗-报培训班学测开-第六十六天
  • 「iOS」————属性关键字底层原理
  • Jupyter Notebook 中高效处理和实时展示来自 OpenCV 和 Pillow 的图像数据探究
  • 网络缓冲区的设计以及C++实现
  • 【Python练习】075. 编写一个函数,实现简单的语音识别功能
  • 项目日记---高并发内存池整体框架
  • 人工智能与医疗健康:AI 助力医疗的新格局
  • 信号传播速度与延时
  • [硬件电路-143]:模拟电路 - 开关电源与线性稳压电源的详细比较
  • PLC传感器接线与输出信号接线
  • Redis实战(7)-- 高级特性 Redis Stream数据结构与基础命令
  • 【0基础PS】PS工具详解--文字工具
  • .NET 开源节点编辑器,将你的程序功能模块节点化
  • pytorch 安装
  • Paxos 算法是什么?介绍 RAFT 和 ZAB,以及它们之间的区别?会有脑裂问题吗?为什么?
  • 算法竞赛阶段二-数据结构(39)数据结构栈模拟实现
  • AI陪伴赛道,热闹背后是真需求还是泡沫?