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

Apache Flink 漫谈系列 - JOIN 算子

发布时间:2018-11-20 17:47:47 所属栏目:教程 来源:孙金城
导读:聊什么 在《Apache Flink 漫谈系列 - SQL概览》中我们先容了JOIN算子的语义和根基的行使方法,先容进程中各人发明Apache Flink在语法语义上是遵循ANSI-SQL尺度的,那么再深思一下传统数据库为啥必要有JOIN算子呢?在实现道理上面Apache Flink内部实现和传统

上面的查询进程切合语义,可是假如在filter前提能过滤很大都据的时辰,先举办数据的过滤,在举办内联接会获取更好的机能,好比我们手工写一下:

  1. mysql> SELECT 
  2.     ->   no, name , score 
  3.     -> FROM student stu JOIN ( SELECT s_no, score FROM score s WHERE s.score >80) as sc ON no = s_no; 
  4. +------+-------+-------+ 
  5. | no   | name  | score | 
  6. +------+-------+-------+ 
  7. | S001 | Sunny |    98 | 
  8. | S003 | Kevin |    88 | 
  9. +------+-------+-------+ 
  10. 2 rows in set (0.00 sec) 

上面写法语义和第一种写法语义同等,获得沟通的查询功效,上面查询进程是:

  • 第一步:执行过滤子查询
    1. mysql> SELECT s_no, score FROM score s WHERE s.score >80; 
    2. +------+-------+ 
    3. | s_no | score | 
    4. +------+-------+ 
    5. | S001 |    98 | 
    6. | S003 |    88 | 
    7. +------+-------+ 
    8. 2 rows in set (0.00 sec) 
  • 第二步:执行内毗连
    1. -> ON no = s_no; 
    2. +------+-------+-------+ 
    3. | no   | name  | score | 
    4. +------+-------+-------+ 
    5. | S001 | Sunny |    98 | 
    6. | S003 | Kevin |    88 | 
    7. +------+-------+-------+ 
    8. 2 rows in set (0.00 sec) 

如上两种写法在语义上同等,但查询机能在数目很大的环境下会有很大差距。上面为了和各人演示沟通的查询语义,可以有差异的查询方法,差异的执行打算。现实上数据库自己的优化器会自动举办查询优化,在内联接中ON的联接前提和WHERE的过滤前提具有沟通的优先级,,详细的执行次序可以由数据库的优化器按照机能耗损抉择。也就是说物理执行打算可以先执行过滤前提举办查询优化,假如仔细的读者也许发明,在第二个写法中,子查询我们不单有行的过滤,也举办了列的裁剪(去除了对查询功效没有效的c_no列),这两个变革现实上对应了数据库中两个优化法则:

  • filter push down
  • project push down

如上优化法则以filter push down 为例,表示优化器对执行plan的优化变换:

Apache Flink 漫谈系列 - JOIN 算子

3. LEFT OUTER JOIN

左外联接语义是返回左表全部行,右表不存在补NULL,为了演示浸染,我们查询没有介入测验的全部门生的后果单:

  1. mysql> SELECT 
  2.     ->   no, name , s.c_no, s.score 
  3.     -> FROM student stu LEFT JOIN score s ON sstu.no = s.s_no 
  4.     -> WHERE s.score is NULL; 
  5. +------+------+------+-------+ 
  6. | no   | name | c_no | score | 
  7. +------+------+------+-------+ 
  8. | S002 | Tom  | NULL |  NULL | 
  9. +------+------+------+-------+ 
  10. 1 row in set (0.00 sec) 

上面查询的执行逻辑上也是分成两步:

  • 第一步:左外联接查询
    1. mysql> SELECT 
    2.     ->   no, name , s.c_no, s.score 
    3.     -> FROM student stu LEFT JOIN score s ON sstu.no = s.s_no; 
    4. +------+-------+------+-------+ 
    5. | no   | name  | c_no | score | 
    6. +------+-------+------+-------+ 
    7. | S001 | Sunny | C01  |    80 | 
    8. | S001 | Sunny | C02  |    98 | 
    9. | S001 | Sunny | C03  |    76 | 
    10. | S002 | Tom   | NULL |  NULL | -- 右表不存在的补NULL 
    11. | S003 | Kevin | C01  |    78 | 
    12. | S003 | Kevin | C02  |    88 | 
    13. | S003 | Kevin | C03  |    68 | 
    14. +------+-------+------+-------+ 
    15. 7 rows in set (0.00 sec) 
  • 第二步:过滤查询
    1. mysql> SELECT  
    2.     ->   no, name , s.c_no, s.score 
    3.     -> FROM student stu LEFT JOIN score s ON sstu.no = s.s_no 
    4.     -> WHERE s.score is NULL; 
    5. +------+------+------+-------+ 
    6. | no   | name | c_no | score | 
    7. +------+------+------+-------+ 
    8. | S002 | Tom  | NULL |  NULL | 
    9. +------+------+------+-------+ 
    10. 1 row in set (0.00 sec) 

(编辑:湖南网)

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

热点阅读