一、连接类型
这个应该不用多介绍,简单列举下
- 内连接: INNER JOIN
- 外连接: LEFT [OUTER] JOIN 、RIGHT [OUTER] JOIN、FULL [OUTER] JOIN
除此之外,GP还引入了三种特殊连接,用于提升子链接时使用
- SEMI JOIN:类似于IN的效果
- ANTI JOIN: 可以看成是LEFT JOIN的结果去除INNER JOIN的结果之后得到的结果
- JOIN_LASJ_NOTIN:用于NOT IN子链接提取
与外连接相比,SEMI JOIN和ANTI JOIN输出的结果集较少,对连接运算的结合律支持与内连接类似,更便于查询优化器的处理。
二、为什么要消除外连接
- 结果集更小
- 便于查询优化器优化,比如多个内连接可以改变连接顺序,寻找更好的查询计划,而非内连接不能随便交换连接顺序
如果能够将外连接转换为内连接,可以让优化器在查询优化的后续步骤更好的基于代价选择更优的连接顺序 。
三、如何消除外连接
- 试图将半外连接转换成内连接
- 试图将全外连接转换成办外连接或内连接
- 试图将LEFT JOIN转换成ANTI JOIN
3.1 外转内
先看一个简单连接查询
A LEFT JOIN B ON A.id = B.id WHERE B.id > 0
分析一下:
这个左外连接可以拆解成两部分