这一部分讨论分布式执行计划的生成 distributed_planner
IsLocalReferenceTableJoin 判断是否有本地表参与join。
这个判断仅发生在Coordinator
参与join的shard表在Coordinator有对应分片
如果有,则直接采用分片名称,代替原始表名进行原生查询
ListContainsDistributedTableRTE
对所有参与的表进行循环判断,如果存在sharding的表,则人为需要分布式执行计划
InsertSelectIntoLocalTable
对于select citus表,insert到本地表的行为,目前不进行支持
AssignRTEIdentities
修改查询树,增加RTE(RTE_RELATION)标记以及内部自增id,避免PG本体对执行计划的变更无法追踪的问题
AdjustPartitioningForDistributedPlanning
对于分区表,citus设置修改其为单体表,避免pg planner对分区逻辑的拆解
ReplaceTableVisibleFunction
在worker节点,设置shard表的可见性
CreateAndPushPlannerRestrictionContext
初始化执行计划的数据结构
单独判断快速路径FastPathRouterQuery
没有CTE,没有子查询,SRF,组(union之类)操作,查询直接面对单个分布式表,操作条件带分区键,对于delete,update没有returning要求
FastPathPlanner 单独的快速查询计划
GeneratePlaceHolderPlannedStmt 生成语句
否则执行标准执行计划standard_planner
这里再次赋值一遍RTE标记
CreateDistributedPlannedStmt 创建分布式执行计划
CreateDistributedPlan 创建分布式执行计划
对于insert,调度CreateInsertSelectPlan
其他修改语句,调度CreateModifyPlan
对于select,首先尝试CreateRouterPlan
GenerateSubplansForSubqueriesAndCTEs 生成子查询和cte查询
AdjustPartitioningForDistributedPlanning 处理掉分区问题
standard_planner 调度标准执行计划
(子查询,CTE迭代)CreateDistributedPlan 创建最终的执行计划
MultiLogicalPlanCreate/MultiLogicalPlanOptimize重新生成没有CTE的执行计划
ShouldUseSubqueryPushDown 需要pushdown的场景,处理其子查询
对于join条件已经包含子查询内容的
where或者having条件包含子查询的
从in/any转变而来的子查询(执行计划标记为hasSemiJoin)
函数RTE
原始sql或者改写的sql包含外连接子查询
DeferErrorIfUnsupportedClause 逻辑执行器不支持的查询
窗口函数
SubqueryMultiNodeTree
处理子查询的条件下推,最终调用SubqueryPushdownMultiNodeTree
正常情况调用MultiNodeTree
对于有子查询的情况,向下迭代处理子查询
计算join顺序 JoinClauseList JoinOrderList
BestJoinOrder 尽量减少数据传输FewestOfJoinRuleType,或者延迟大量数据的传输时机LatestLargeDataTransfer
从底向上构建执行计划 UsedTableEntryList AddMultiCollectNodes
最终结合join顺序构建最终执行计划 MultiJoinTree
MultiLogicalPlanOptimize 优化执行计划
切割AND(AndSelectNode),OR条件组(OrSelectNode),下推AND条件
下推所有需要返回的列
下推需要聚合计算的列
上推数据搜集节点(PullUpCollectLoop)
找到额外操作(extend)的节点extendedOpNodeList,切割到master,woker上的额外操作节点ApplyExtendedOpNodes
CheckNodeIsDumpable 检查节点
CreatePhysicalDistributedPlan 创建实际的执行计划
创建task
DistributedPlanRouterExecutable 对可以路由的语句返回true
以下为不可路由的场景
只有一个语句
没有依赖的执行任务
主语句需要sort
存在聚合计算的情况
所有执行计划返回前,都调用FinalizeDistributedPlan
AdjustPartitioningForDistributedPlanning 处理分布式执行计划的表分区问题
「喜欢这篇文章,您的关注和赞赏是给作者最好的鼓励」
关注作者
【版权声明】本文为墨天轮用户原创内容,转载时必须标注文章的来源(墨天轮),文章链接,文章作者等基本信息,否则作者和墨天轮有权追究责任。如果您发现墨天轮中有涉嫌抄袭或者侵权的内容,欢迎发送邮件至:contact@modb.pro进行举报,并提供相关证据,一经查实,墨天轮将立刻删除相关内容。




