暂无图片
暂无图片
暂无图片
暂无图片
暂无图片

citus 分布式执行计划生成代码细节 distributed_planner

原创 刘伟 2019-12-20
1735

这一部分讨论分布式执行计划的生成 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进行举报,并提供相关证据,一经查实,墨天轮将立刻删除相关内容。

评论