关于“外连接消除”的问题

oceanbaseSQL优化器中有个“外连接消除”的操作,有大神能举例说明一下是什么意思吗?

外连接消除就是将一个left outer join或者right outer join 转换成 inner join。

select * from a left join b on a.id=b.id where b.col1=1;
可以改写成select * from a inner join b on a.id=b.id where b.col1=1;查询列中不可能出现b中不为null的行,假设有这样的行,它也一定会被条件where b.col1 = 1 过滤掉这样就可以消除了

2 个赞

外连接消除是一种查询优化技术,旨在将外连接(如左外连接、右外连接和全外连接)转换为内连接,从而提供更多可选择的连接路径,供优化器使用。以下是外连接消除的主要特点和适用条件:

目的:

提高查询性能:通过将外连接转换为内连接,可以减少查询的复杂性和执行时间,使优化器有更多的选择来生成更优的执行计划

适用条件:

空值拒绝条件:在 WHERE 条件中必须存在一个条件,当内表生成的值为 NULL 时,输出为 FALSE。例如,t2.c2 > 5 就是一个空值拒绝条件,因为它确保了 t2.c2 不可能为 NULL

示例:

原始查询:

SELECT t1.c1, t2.c2 FROM t1 LEFT JOIN t2 ON t1.c2 = t2.c2;

在这个查询中,t2.c2 可能为 NULL。

添加空值拒绝条件后的查询:

SELECT t1.c1, t2.c2 FROM t1 LEFT JOIN t2 ON t1.c2 = t2.c2 WHERE t2.c2 > 5;

通过 t2.c2 > 5 这个条件,可以确保 t2.c2 不为 NULL,从而将外连接转换为内连接:

SELECT t1.c1, t2.c2 FROM t1 INNER JOIN t2 ON t1.c2 = t2.c2 WHERE t2.c2 > 5;

优化效果:

连接顺序选择:外连接的左右顺序不能变换,这限制了优化器的选择。通过外连接消除,优化器可以自由选择连接顺序,从而生成更优的执行计划

减少数据扫描:内连接通常比外连接更高效,因为内连接可以直接排除不符合条件的行,减少了数据扫描的范围