外连接消除就是将一个 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 多得多。