Oracle 2005 年出了一个 30 多页的小册子,《Query Optimization in Oracle Database10g Release 2》,介绍了常见的优化器技术。
我是做 SQL 执行的,优化部分只了解皮毛,从没有系统学习过。本系列逐个学习和介绍,自我提升,也帮助他人。
外连接消除就是将一个 outer join 转换成 inner join。
例如下面的查询适合做外连接消除:
select * from a left join b on a.pk = b.pk where b.col = 3;
它可以被等价地改写成:
select * from a inner join b on a.pk = b.pk where b.col = 3;
为什么呢?因为这个查询的结果中不可能出现 b 为 NULL 的行,假设有这样的行,它也一定会被 where b.col = 3 过滤掉。这使得使用 outer join 和使用 inner join 的效果等价。
“外连接消除” 最终目的是给优化器带来更多的灵活性,inner join 可以选择的优化路径比 outer join 多得多。