Skip to content

模型Model

迭代器执行、阻塞与流水线

Volcano iterator · Query pipeline · Pipeline breaker · Iterator execution

用open/next/close契约跟踪行出现次数、暂停状态和页引用,解释过滤可流水而排序、hash build会形成阶段边界。

形式陈述 ​

物理算子实现open、next、close三个接口。open初始化一次执行的游标和资源;每次next返回一条记录出现或独立的EOF标记;close释放页引用、工作内存和临时文件句柄。EOF不是一条所有字段为NULL的记录。调用方不得在close之后继续使用算子的借用输出。

本页采用bag语义:同值输入出现两次,就必须按照算子的逻辑规则处理两次。扫描记住页号、槽位置;选择算子的next反复调用子算子,遇到满足谓词的行就返回,遇EOF才结束;投影保留出现次数,不自动去重。状态不变量是已经返回的序列恰好对应已经消费输入中的合格出现,尚未消费部分仍可继续产生剩余答案。

流水线允许子算子产生一条或一批后,立即由上层消费,而不先把全部中间结果写盘。阻塞是具体实现的性质:普通全排序必须先知道全部输入才能保证首项最小;hash join通常先完成build侧哈希表再开始probe,但probe侧可逐条流出匹配。嵌套循环连接可以在第一对匹配时产生输出。因此“连接一律阻塞”不成立。

直觉

父算子问“再给我一条”,子算子可以继续向下问;数据沿相反方向返回。next返回并不代表内部循环结束,而是把游标保留下来,等下一次调用从暂停处继续。

统一接口使算子容易组合,却不会使资源需求消失。一个next可能立刻返回,也可能先扫描整张表、排序和溢写许多页。

例子与边界

扫描R的值序列为(1,A),(2,B),(1,A),(3,C),(2,D),(4,E)。在Scan之上放Filter(k=1)、Project(v)、Limit(2)。第一次根next会读到第一份A;第二次先跳过B,再返回第二份A。结果为[A,A],不是[A]。如果Limit不再调用子算子,扫描无需读取后面的C,D,E;它仍须close整棵执行树,释放最后仍pin的页。

将Limit移到过滤下面变成Filter(k=1,Limit(2,Scan)),只读前两条,只得[A]。这不是等价计划,因为截断先于筛选。没有ORDER BY时,这种“前两条”也依赖访问路径,不能当成关系本身的顺序。

把Sort(k)插在Scan与Limit之间,常规全排序必须先消费6条,才能返回全局最小键。若使用专门Top-2算法可以只保存两个候选,但仍须检查全部无序输入;内存下降不等于扫描可提前停止。

join一次next怎样返回多个匹配 ​

若某probe行(2,u)在build中匹配(2,B)、(2,D),第一次next返回(2,B,u)后,必须保留当前probe行及桶内匹配游标。下一次先返回(2,D,u),才能取下一probe行。如果每次next都取一个新probe行,就丢了一半配对;如果不前进桶游标,就会无限重复第一对。

借用输出也有生命周期:若记录指向当前输入页,父算子还未用完时子算子不能释放pin并复用页。可以让调用约定保证“下一次next前有效”,也可以复制记录转移所有权;两种契约都比默默悬垂安全。

推论与应用

批量执行把next的一条扩成最多K条,能减少函数调用与分支开销,但仍要保存bag重数、EOF和资源释放契约。K个位置列表不是K个去重值,列存也不要求每一层都物化整行。

两个同时活跃的算子不能各自假设独占全部缓冲。若子算子pin住两页、父算子还需三页,而总预算只有四页,接口虽匹配,计划仍不可按这个调度执行。物理成本模型必须把这种同时占用与阶段切换纳入预算。

扩展到SQL NULL时,普通等号比较NULL产生UNKNOWN,Filter/内连接只保留TRUE;IS NOT DISTINCT FROM具有不同匹配规则。本单元手算固定无NULL,以免把普通等号内连接与NULL安全相等混在一份证明中。外连接补行也要另定语义,不能只在本页内连接最后随意补NULL。

这份边界可继续沿SQL三值筛选和外连接出现级状态机展开:next返回匹配后保存matched与右游标,确认右输入耗尽后才决定是否补一行。NULL敏感排除还要求build完整进入READY才把未命中当作否定证据,读失败或容量超限须保留FAILED,不能伪装成EOF。

批次的完整交付合同见向量化批次与选择位置:区分容量、有效长度、活动选择和借用代次,并分别处理空批、END与ERROR。它以逐出现不变量证明不同批切分仍输出同一bag,不改变本页逐行游标与阻塞边界。

参考资料
关系图谱6 个相邻概念 · 2 类关系

拖动节点调整位置。

显示关系

显示:依赖

  1. 前置三跳
  2. 前置二跳
  3. 前置一跳
  4. 当前条目
  5. 后续一跳
  6. 后续二跳
  7. 后续三跳
文字版关系按与当前条目的最短距离分组
类型化关系