IT数码 购物 网址 头条 软件 日历 阅读 图书馆
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
图片批量下载器
↓批量下载图片,美女图库↓
图片自动播放器
↓图片自动播放器↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁
 
   -> 数据结构与算法 -> Calcite HepPlanner的Graph -> 正文阅读

[数据结构与算法]Calcite HepPlanner的Graph

前言

读到了篇有用的博客,介绍了Hepplaner的调用流程,总结起来就是setRoot()将RelNode注册到Graph中(Graph的顶点叫HepRelVertex是对RelNode封装),再进入findBest()按照program一组组的执行优化规则,从Graph中取出符合的点来应用规则。

Graph

以HHepPlannerTest#testRuleClass为例,看看Graph的变化

addRelToGraph

调用流程依旧是从setRoot()进入addRelToGraph,注意此刻的plan进行DFS的第一条路径应该为:LogicalIntersect -> LogicalUnion -> LogicalProject -> LogicalTableScan
在这里插入图片描述
下面看这条路径上的每个节点是如何注册的

LogicalTableScan

按照刚刚的提到路径进入到了最深层,因为是最底层没有input所以不会进入onCopy(oldRel, rel)的逻辑

onCopy(oldRel, rel)是为了将HepRelVertex的input从RelNode替换为HepRelVertex

在这里插入图片描述
此时mapDigestToVertex中还没有节点,拿不到等价的边,而是直接走到下面创建新的顶点和边
在这里插入图片描述

LogicalProject

刚刚的LogicalTableScan已经注册,所以mapDigestToVertex有一对KV记录着它。需要注意的是这个key是通过RelNode#getDigest获得的,所以自己实现RelNode的时候要注意Digest,避免意外地被认为等价
在这里插入图片描述
LogicalProject注册进去的时候,Graph中有了2个点1条边
在这里插入图片描述

LogicalUnion

LogicalUnion有两个input,刚刚只是注册完了第一个,第二个的注册其实和第一个一样就不深入了
在这里插入图片描述
刚刚提到 onCopy(oldRel, rel)将relNode的input替换为Vertex,此刻两个input都是VertexVertex持有着原来的relNode
在这里插入图片描述
LogicalUnion注册完之后,有4条边5个点了
在这里插入图片描述

LogicalIntersect

LogicalIntersect也有两个input,另一input注册同理不再深入,最终注册完得到的Graph有8个点7条边
在这里插入图片描述
整个Graph画出来的话就是这样,边的注册顺序其实就是层序遍历的顺序
在这里插入图片描述

applyRules

Graph顶点HepRelVertex应用相应规则的时候遍历顺序可以指定,默认为DEPTH_FIRST
在这里插入图片描述
iter拿到指定顺序排列的顶点
在这里插入图片描述
会尝试着对每个节点应用所有的规则
在这里插入图片描述

applyRule

尝试应用规则的时候,会先判断规则定义的Operand和当前的Operand是否匹配,再判断规则的附加条件
在这里插入图片描述
都匹配了之后会进行优化,并将优化的结果取出封装为新的顶点注册到Graph
在这里插入图片描述

总结

优化的时候会不断往Graph中注册新的边和点,当不再有新节点添加或者到达匹配次数的时候结束,此刻得到的RelNode被认为是最终的plan。

  数据结构与算法 最新文章
【力扣106】 从中序与后续遍历序列构造二叉
leetcode 322 零钱兑换
哈希的应用:海量数据处理
动态规划|最短Hamilton路径
华为机试_HJ41 称砝码【中等】【menset】【
【C与数据结构】——寒假提高每日练习Day1
基础算法——堆排序
2023王道数据结构线性表--单链表课后习题部
LeetCode 之 反转链表的一部分
【题解】lintcode必刷50题<有效的括号序列
上一篇文章      下一篇文章      查看所有文章
加:2022-03-06 13:22:01  更:2022-03-06 13:27:51 
 
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁

360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年11日历 -2024/11/26 13:30:37-

图片自动播放器
↓图片自动播放器↓
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
图片批量下载器
↓批量下载图片,美女图库↓
  网站联系: qq:121756557 email:121756557@qq.com  IT数码