Apache Flink 漫谈系列 - JOIN LATERAL
我们分析上面的需求,本质上是根据左表Customers的customerid,去查询右表的Orders信息,就像一个For循环一样,外层是遍历左表Customers所有数据,内层是根据左表Customers的每一个Customerid去右表Orders中进行遍历查询,然后再将符合条件的左右表数据进行JOIN,这种根据左表逐条数据动态生成右表进行JOIN的语义,SQL标准里面提出了LATERAL关键字,也叫做 lateral drive table。 1. CROSS APPLY和LATERAL 上面的示例我们用的是SQL Server进行测试的,这里在多提一下在SQL Server里面是如何支持 LATERAL 的呢?SQL Server是用自己的方言 CROSS APPLY 来支持的。那么为啥不用ANSI-SQL的LATERAL而用CROSS APPLY呢? 可能的原因是当时SQL Server为了解决TVF问题而引入的,同时LATERAL是SQL2003引入的,而CROSS APPLY是SQL Server 2005就支持了,SQL Server 2005的开发是在2000年就进行了,这个可能也有个时间差,等LATERAL出来的时候,CROSS APPLY在SQL Server里面已经开发完成了。所以种种原因SQL Server里面就采用了CROSS APPLY,但CROSS APPLY的语义与LATERAL却完全一致,同时后续支持LATERAL的Oracle12和PostgreSQL94同时支持了LATERAL和CROSS APPLY。 2. 问题解决 那么我们回到上面的问题,我们用SQL Server的CROSS APPLY来解决上面问题,SQL如下: 上面得到的结果完全满足查询需求。 四、JOIN LATERAL 与 INNER JOIN 关系 上面的查询需求并没有体现JOIN LATERAL和INNER JOIN的区别,我们还是以SQL Server中两个查询执行Plan来观察一下: 上面我们发现经过SQL Server优化器优化之后的两个执行plan完全一致,那么为啥还要再造一个LATERAL 出来呢? 1. 性能方面 我们将上面的查询需求稍微改变一下,我们查询所有Customer和Customers的第一份订单信息。
查询结果: 我们发现虽然C001的Customer有三笔订单,但是我们查询的TOP1信息。
查询结果: 如上我们都完成了查询需求,我们在来看一下执行Plan,如下: 我们直观发现完成相同功能,使用CROSS APPLY进行查询,执行Plan简单许多。 2. 功能方面 (编辑:开发网_郴州站长网) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |