“最坏情形最优连接把这些有限集合实现为切片与前缀索引,展开一般NPRR锚关系递归。四张三元表的完整执行区分最终答案、枚举候选与二元中间结果;这些成本结论均使用集合语义。”
形式陈述
全连接与分数边覆盖
固定一个输出全部变量的合取查询。用有限属性集
若原查询的原子含常量或重复变量,先逐个原子规范化:扫描它对应的原始关系,只保留常量位置匹配、同一变量的所有位置取值相等的记录,再投影为每个不同变量各一列的集合
以下的
这里没有 NULL、重复计数或额外依赖约束。任何输入表为空时,直接返回空集。以下设
AGM 界断言,对每个这样的覆盖,都有
因此,令
本页所有对数均为自然对数,熵也使用自然对数定义;
“最坏情形最优”的量词
连接算法若在固定查询下,以
本页先证明三角形的两分支规则,再展开一般 NPRR 的锚关系递归、正确性与固定查询成本。一般执行使用切片计数选择局部分支,不把三角形阈值直接套在任意超图上。
直觉
一张表约束它所涉及属性的联合取值。三角形查询中,每个属性被两张表约束,给每张表半份权重,便恰好覆盖每个属性一次。输出元组若很多,其联合不确定性就大;但每张输入表都限制了一部分不确定性,覆盖权重把这些限制合成为总输出的上界。
执行算法面临的是另一件事:先连接两张表,可能暂时枚举许多最终会被第三张表否决的组合。共享值的度数很大时,这一步尤其昂贵。重轻分解对高度数值改从第三张表出发,对低度数值才展开二元连接,从而把两种不同的枚举成本配平。
例子与边界
三角形的精确证书与达到上界的输入
取
覆盖约束是
这不只是列出四个可行解。令
整覆盖
它们非负。将三个覆盖约束分别乘以
令
三角形的重轻枚举
令
Triangle(R, S, T):
if any input is empty: return
build membership indexes for R, S, T
group R and S by their B coordinate
tau = sqrt(|R| * |T| / |S|)
D = {b in keys(R): |R[b]| > tau}
for b in D: # 重值:从第三张表出发
for (a, c) in T:
if (a, b) in R and (b, c) in S:
emit (a, b, c)
for b in keys(R) with b not in D: # 轻值:展开受控的二元连接
for a in R[b]:
for c in S.get(b, empty):
if (a, c) in T:
emit (a, b, c)
每个输出的
因为
取
16 行输入为什么产生 72 与 24
在每张表的两个属性位置放入同一个对称星形关系
每张表有
重轻算法取
把
一般 NPRR:按锚关系拆分属性
下面展开原始 NPRR 的边顺序递归,而非把逐个属性的 Generic Join 改名为 NPRR。[4, Algorithms 2–4、Procedure 5] 先固定边顺序
查询计划树的左子问题是
按左块在前、右块在后的顺序输出属性;没有右子树时仍输出只由锚覆盖的剩余属性。这给出一个全局次序,使每个递归属性块连续。每张表按这个次序的限制建立前缀索引,支持三种操作:前缀是否存在;固定前缀后某段属性投影有多少个不同元组;枚举该投影。计数存在索引中,不为每次询问重新扫描原表。用原文的哈希索引实现,可在
记
Join(U, k, y, s):
检查前 k 张表的相关切片投影;若有空集,返回空集
若 U 为空,返回 {s}
若 U 包含于每个 e_i (i <= k):
枚举最小的 U 投影,只保留属于其余全部投影的元组
返回它们与 s 的拼接
W = U \ e_k; Z = U ∩ e_k
L = {s} 若 W 为空,否则 Join(W, k-1, y[1:k-1], s)
若 Z 为空,返回 L
q = 锚关系 R_k[s] 在 Z 上的投影大小
对每个 (s,w) in L:
A_i = R_i[(s,w)] 在 Z ∩ e_i 上的投影 (i < k)
若某个 A_i 为空,跳过本前缀
alpha = y_k
若 alpha < 1,计算 p = product_i |A_i|^(y_i/(1-alpha))
若 alpha < 1 且 p < q:
递归 Join(Z, k-1, y[1:k-1]/(1-alpha), (s,w))
用锚关系的 Z 投影过滤递归答案
否则:
枚举锚关系的 Z 投影,用所有 A_i 过滤
输出通过过滤的完整拼接
零权重对应的因子为一;先拒绝空切片,再计算乘积,因此无需把
递归调用确实有合法覆盖。
若某个
正确性按树归纳。叶子求的是集合交;内部节点中,任何完整答案的
非三角超图的两层分支
取四张三元表
每张表在其显示的列顺序上都使用七个元组
每个属性出现三次,故
按上面的边顺序,根的锚为
| 前缀 | 三个二列切片大小 | 右侧覆盖 | 预算 |
动作与结果 |
|---|---|---|---|---|
| 都为 |
各 |
扫描 |
||
| 都为 |
各 |
递归三角形,得到 |
||
| 都为 |
各 |
同上,得到 |
后两次递归的锚是
枚举循环共执行
任意两张原表先二元连接时,共享的两个坐标为
上述 NPRR 执行的枚举循环为
集合、投影与约束的边界
若每张表包含同一匹配二元组的
键约束、函数依赖或已知度数分布会缩小允许实例的范围,可能给出更强的界。AGM 使用的只是表大小和属性覆盖;上面的无三角形星形实例也表明,它通常不是单个实例的精确输出预测。
推论与应用
用条件熵证明一般 AGM 界
若
乘以非负的
第二步用到了离散条件熵非负。另一方面,
一般递归的成本为何不会乘出巨大中间表
固定一次调用,记各非空投影大小为
零列真关系的大小为一。所有
固定
若
现在不能直接将每个前缀的最坏成本乘以
证明如下。零权重略去;若某个正权重因子的总和为零,左侧也为零。否则将每个
第二步是加权算术—几何平均不等式,证明了式 (2)。
按全局次序把
没有剩余坐标时,式 (3) 就是单次扩展界。若某前缀的切片为空,直接拒绝它,不把检查开销记成“零时间”。
为把递归调度也写进账本,设
根的非空输入给出
对固定查询,
运行时间实际包含什么
三角形算法读取、分组并建立哈希表索引,预处理的期望时间与空间都是
答案可以流式输出,额外工作空间为
固定查询的结构常数不能在查询也增长时隐去。NPRR 原文 Theorem 3.2 给出的一般界为
参考资料
-
[1] Albert Atserias、Martin Grohe、Dániel Marx,Size Bounds and Query Plans for Relational Joins,arXiv 上传版本,§3 Lemmas 2–4(PDF pp. 6–8)给出分数覆盖界;§4.1 Theorem 10(PDF pp. 11–12)给出指定关系大小时相差至多查询相关因子的紧性。
-
[2] Hung Q. Ngo、Ely Porat、Christopher Ré、Atri Rudra,Worst-case Optimal Join Algorithms,PODS 2012,§3.1 Example 2:三角形的重轻分解;§3.2 Theorem 3.2、Remark 3.3:一般运行时间与预处理假设。
-
[3] Hung Q. Ngo,Worst-case Optimal Join Algorithms 讲义,PDF pp. 3、16、24–25、40:最坏情形最优的含义、三角形界与熵证明。在线版本访问于 2026-10-03,文件未注明授课日期。
-
[4] Hung Q. Ngo、Ely Porat、Christopher Ré、Atri Rudra,Worst-case Optimal Join Algorithms,完整版本,§5.3,Algorithms 2–4、Procedure 5、Lemma 5.6(PDF pp. 17–22):计划树、索引、锚关系递归与切片求和;§6,Lemmas 6.1–6.2:至多一个非零坐标的实例族。正文四属性算例把该族的实际执行逐步展开。