加入收藏 | 设为首页 | 会员中心 | 我要投稿 湖南网 (https://www.hunanwang.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 教程 > 正文

Apache Flink 漫谈系列(10) - JOIN LATERAL

发布时间:2018-12-11 20:59:57 所属栏目:教程 来源:孙金城
导读:一、聊什么 上一篇《Apache Flink 漫谈系列 - JOIN算子》我们对最常见的JOIN做了细致的说明,本篇先容一个非凡的JOIN,那就是JOIN LATERAL。JOIN LATERAL为什么非凡呢,直观说由于JOIN的右边不是一个现实的物理表,而是一个VIEW可能Table-valued Funciton

我们说明上面的需求,本质上是按照左表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 漫谈系列(10) - JOIN LATERAL

上面获得的功效完全满意查询需求。

四、JOIN LATERAL 与 INNER JOIN 相关

上面的查询需求并没有浮现JOIN LATERAL和INNER JOIN的区别,我们照旧以SQL Server中两个查询执行Plan来调查一下:

Apache Flink 漫谈系列(10) - 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 漫谈系列(10) - 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 漫谈系列(10) - JOIN LATERAL

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

Apache Flink 漫谈系列(10) - JOIN LATERAL

我们直观发明完成沟通成果,行使CROSS APPLY举办查询,执行Plan简朴很多。

2. 成果方面

(编辑:湖南网)

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

热点阅读