加载中...

子查询去关联(Subquery Unnesting / Decorrelation)指优化器将关联子查询(子查询引用了外层查询的列)改写为等价的连接(通常是 semi-join、anti-join 或普通 join)的过程,又称子查询展开。
关联子查询若按朴素语义执行,外层每一行都要执行一次子查询,复杂度随外层行数线性放大,俗称"每行一查"。改写为连接后,优化器可以统一规划连接顺序与算法(如哈希连接),性能常有数量级提升。
EXISTS 关联子查询转为 semi-join;NOT EXISTS/NOT IN 转为 anti-join(需注意 NULL 语义差异);标量关联子查询可转为带聚合的外连接。复杂情形(子查询含聚合、窗口、LIMIT)的去关联在理论与工程上都更困难,德国慕尼黑工业大学提出的 Unnesting Arbitrary Queries 给出了通用去关联方法,被 DuckDB 等系统采纳。
各数据库去关联能力差异很大:能力弱的系统(及旧版 MySQL)上,关联子查询是慢查询的高发地,需要人工改写成 JOIN;能力强的系统则可放心使用子查询表达业务逻辑。

登录 后参与讨论
暂无讨论,来发表第一条评论吧