加入收藏 | 设为首页 | 会员中心 | 我要投稿 开发网_郴州站长网 (http://www.0735zz.com/)- 云通信、区块链、物联设备、云计算、站长网!
当前位置: 首页 > 运营中心 > 网站设计 > 教程 > 正文

Apache Flink 漫谈系列 - JOIN LATERAL

发布时间:2018-12-06 10:24:38 所属栏目:教程 来源:孙金城
导读:副标题#e# 一、聊什么 上一篇《Apache Flink 漫谈系列 - JOIN算子》我们对最常见的JOIN做了详尽的分析,本篇介绍一个特殊的JOIN,,那就是JOIN LATERAL。JOIN LATERAL为什么特殊呢,直观说因为JOIN的右边不是一个实际的物理表,而是一个VIEW或者Table-value

我们分析上面的需求,本质上是根据左表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如下:

Apache Flink 漫谈系列 - JOIN LATERAL

上面得到的结果完全满足查询需求。

四、JOIN LATERAL 与 INNER JOIN 关系

上面的查询需求并没有体现JOIN LATERAL和INNER JOIN的区别,我们还是以SQL Server中两个查询执行Plan来观察一下:

Apache Flink 漫谈系列 - JOIN LATERAL

上面我们发现经过SQL Server优化器优化之后的两个执行plan完全一致,那么为啥还要再造一个LATERAL 出来呢?

1. 性能方面

我们将上面的查询需求稍微改变一下,我们查询所有Customer和Customers的第一份订单信息。

  • LATERAL 的写法
  1. SELECT 
  2. c.customerid, c.city, o.orderid 
  3. FROM Customers c CROSS APPLY ( 
  4. SELECT 
  5. TOP(1) o.orderid, o.customerid 
  6. FROM Orders o 
  7. WHERE o.customerid = c.customerid 
  8.     ORDER BY o.customerid, o.orderid 
  9. ) as o 

查询结果:

Apache Flink 漫谈系列 - JOIN LATERAL

我们发现虽然C001的Customer有三笔订单,但是我们查询的TOP1信息。

  • JOIN 写法
  1. SELECT c.customerid, c.city, o.orderid 
  2. FROM Customers c 
  3. JOIN ( 
  4. SELECT 
  5. o2.*, 
  6.      ROW_NUMBER() OVER ( 
  7.         PARTITION BY customerid 
  8.         ORDER BY orderid 
  9.      ) AS rn 
  10. FROM Orders o2 
  11. ) o 
  12. ON c.customerid = o.customerid AND o.rn = 1 

查询结果:

Apache Flink 漫谈系列 - JOIN LATERAL

如上我们都完成了查询需求,我们在来看一下执行Plan,如下:

Apache Flink 漫谈系列 - JOIN LATERAL

我们直观发现完成相同功能,使用CROSS APPLY进行查询,执行Plan简单许多。

2. 功能方面

(编辑:开发网_郴州站长网)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

热点阅读