“执行器可以传整行、位置列表或列批次。延迟取列可减少中间结果宽度,而连接复制多份匹配位置时仍须保留bag重数。计算计划成本时因此同时需要行数、行宽和物化方式,仅知道输出12行不够。”
形式陈述
物理算子实现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,不改变本页逐行游标与阻塞边界。
参考资料
- Goetz Graefe, “Volcano—An Extensible and Parallel Query Evaluation System”,IEEE TKDE 6(1), 1994,§III.A–B,印刷pp.123–124:借用记录、统一迭代接口与状态。
- CMU 15-445/645 Fall 2025,Query Processing I,§§1–2:控制流、数据流与批量/物化执行。