本篇主要介绍的是--外连接查询中的谓词下推规则,这相比内连接中的规则要复杂一些,不过使用简单的表格来进行分析也是可以分析清楚的。

目录:

1.左表 join 后条件下推

2.左表join中条件不下推

3.右表join中条件下推

4.右表join中条件不下推

5.总结


先上表:

我们以左外连接查询为例,先总结规矩如下:

接下来对这个表格中的规则进行详细的分析。

1.左表join后条件下推

查询语句如下:

前文有提到,对于join后条件,如果放在join操作后执行,是可以作为正确结果进行比对的。那么先对两表进行左连接,结果如下:

然后使用LT.id>1这个join后条件进行过滤,结果如下:

来分析一下LT.id>1下推到左表进行数据过滤的结果,经过LT.id>1过滤后,左表变为:

此时再和右表进行左连接,左表id为2的行,在右表中能找到id为2的行,则连接结果如下:

可见,两种处理方法结果一致。条件下推过滤了左表整整50%的数据(相当牛,虽然只过滤了一条)。究其原因,是因为在SparkSQL中,把以上的查询解析成了如下的子查询:

这是一个非相关子查询,即完全可以先完成子查询,再完成父查询,子查询在查询过程中和外部查询没有关联关系。

2.左表join中条件不下推

查询语句如下:

来看看不下推的情况下计算出的正确结果,join过程如下:

第一步:左表id为1的行在右表中能找到相等的id,但是左表的id为1,是不满足第二个join条件(LT.id>1)的,所以左表这一条相当于没有和右表join上,所以左表的值value保留,而右表的value为null(你没满足join中条件没join上还把你的值保留,给我搞个空值?没办法,就是这么任性)。

第二步:左表id为2的行在右表中能找到,而且左表id为2的行的id大于1,两个join条件都满足,所以算是和右表join上了,所以左表和右表的value都保留。最终的查询结果如下:

那么如果把"LT.id>1"这个条件下推到做表,会得到什么结果呢?

首先左表经过"LT.id>1"过滤后,如下:

此时再和右表连接,左表id为2的行在右表中能找到,且满足"LT.id = RT.id AND LT.id > 1"这个join中条件,所以两表的value都被保留。左表中已经没有数据了,查询结束,查询结果如下:

这个查询结果和不下推的正确结果不一致,是个错误的结果,所以左表join中条件是不能下推进行数据过滤的。分析原因:主要是因为join中条件和join后条件对结果的处理方式不同,前者在不满足join条件时会保留一部分结果,而后者在不满足条件时任何东西都不保留。

3.右表join中条件下推

查询语句如下:

现在把RT.id>1这个右表join后条件下推,来过滤右表,过滤后如下:

然后左表再和右表进行左连接,流程如下:

第一步:左表id为1的行在右表中没有,此时左表值保留,右表为null;

第二步:左表id位2的行在右表中有,并且RT.id大于1,两个join条件都满足,则左表和右表的值都保留。查询结果如下:

那么如果不下推(为了得到正确结果),来看看结果,流程如下:

第一步:左表id为1的行在右表中有,但是不满足第二个join条件,所以这行算是没join上,所以左表数据保留,右表为null;

第二步:左表id为2的行在右表中有,也满足第二个join条件,所以左右表的数据都保留。

可见,右表join中条件下推不下推,结果一样,所以,干吗不下推?可以过滤掉一半的数据呢。SparkSQL中的等价处理语句是:

可以看出,也是解析成了一个非相关子查询来处理的。

4.右表join中条件不下推

这个应该是最违反常规理解的查询了,查询语句如下:

首先来看,join后条件不下推的情况,流程如下:

第一步:左表id为1的行在右表中可以找到,但是此时仅仅满足join条件,在使用where条件判断这条连接后数据时,发现右表的id不满足RT.id>1的条件,所以这条join结果不保留(注意:这里是不保留,全都不保留,左表右表都不保留,要跟上边的没join上而右表的值保留为null的情况区别开,这也是关键所在);

第二步:左表id为2的行和右表id为2的行join上了,同时也满足RT.id>1的where条件。

这是一条符合语义的正确的查询结果。

好了,接下来看看右表join后条件下推的情况:

第一步:使用RT.id>1过滤右表,过滤后右表只剩一行id为2的行;

第二步:左表id为1的行在过滤后的右表中没有,此时左表值保留,右表值为null;

第三步:左表id为2的行在右表中有,此时左表值保留,右表值也保留。

结果如下:

很明显这其实是一个错误的结果。

总结

至此,左连接查询的四条规则分析完了。可以看出,在SparkSQL中对于外连接查询时的过滤条件,并不能在所有情况下都用来进行数据源的过滤,如果使用得当会极大的提升查询性能,如果使用不当,则会产生错误的查询结果,而这种错误结果又不易发觉,所以使用时要格外小心。

作者:李勇

来源:vivo互联网技术

sequelize 左连接 left join_SparkSQL连接查询中的谓词下推处理(下)相关推荐

  1. 【大数据】SparkSql 连接查询中的谓词下推处理 (一)

    本文首发于 vivo互联网技术 微信公众号 https://mp.weixin.qq.com/s/YPN85WBNcnhk8xKjTPTa2g 作者:李勇 目录: 1.SparkSql 2.连接查询和 ...

  2. join和子查询效率_SparkSQL连接查询中的谓词下推处理(上)

    SparkSQL是架构在 Spark 计算框架之上的分布式 Sql 引擎,使用 DataFrame 和 DataSet 承载结构化和半结构化数据来实现数据复杂查询处理,提供的 DSL可以直接使用 sc ...

  3. open表和closed表_什么是左外连接?左外连接在工作表查询中的应用

    大家好,我们今天接着讲连接的方式的第二种,左外连接.在上两讲中,我们讲了内连接,并用内连接分别连接数据库和EXCEL进行了实例的应用讲解,我们今日讲解第二种连接:左外联接. 所谓左外联接,是以左表为基 ...

  4. mysql 多表既有内连接又有外连接_MySQL 多表查询中的内连接和外连接

    一般情况下一个网站的数据库通常会有多张数据表组成,这些数据表分别存储网站不同区域的内容.数据表之间可以用类似 ID 的字段来关联,在查询的时候可以通过一条语句来查询多张表的内容.例如 论坛的数据库,帖 ...

  5. 浅谈一个新人的大数据之路-HiveQLSpark-SQL中谓词下推

    CCCCCold丶大数据之禅 什么是谓词下推? 为什么要进行谓词下推? 谓词下推优化方式 谓词下推在Join中应用 INNER JOIN LEFT/RIGHT OUTER JOIN 什么是谓词下推? ...

  6. 一文弄懂Hive中谓词下推(on与where的区别)

    文章目录 场景模拟 问题描述 Hive谓词下推 谓词下推概念 PPD 配置 基本概念 官网解释 规则总结 规则表 特殊说明 结论 场景模拟 数仓实际开发中经常会涉及到多表关联,这个时候就会涉及到on与 ...

  7. Oceanbase查询改写:谓词移动

    概述 当查询语句中存在谓词时,能够减少执行阶段需要处理的数据量.为此,Oceanbase中定义了谓词移动规则,能够利用查询语句中各部分已有的谓词推导出新的谓词,并将其尽可能下推至数据读取阶段,从而减少 ...

  8. 【MySQL】MySQL中的查询语句的详解----等值连接、左连接、右连接、全连接

    用两个表(t_worker,t_depart),关联字段t_worker.deptno和t_depart.deptno来演示一下MySQL的等值连接.左连接.右连接.全连接.数据库表:t_worker ...

  9. MyBaties中多表查询及数据库左连接、右连接、内连接、全连接笔记

    本文最终目的是介绍MyBaties中多表查询方法,最难的就是多对多的查询方式,在此之前咱们先一起复习一下数据库的两表间的连接方式. 数据库表连接方式 数据库两个表之间有四种连接方式,其中包括左连接.右 ...

最新文章

  1. ZPhotoEngine超级算法库
  2. 关于动态修改定时器的时间间隔
  3. 关于C3P0容错和自动重连特性的研究
  4. 转:用ASP.NET创建网络相册
  5. MySQL5.7的配置文件
  6. Atata——C# Web测试自动化框架
  7. 揭秘Spring——《Spring 揭秘》读书笔记纲要
  8. koa2 mysql增删改查_使用nodejs-koa2-mysql-sequelize-jwt实现登录注册,文章增删改查接口...
  9. Mac/Linux 安装ab(Apache Benchmark)
  10. Java JDK8新特性Lambda表达式
  11. DNS被劫持如何处理?
  12. 新建的web项目为什么默认访问index.jsp
  13. Fuzzy C-Means(模糊C均值聚类)算法原理详解与python实现
  14. 网络请求框架 -- 理解Https
  15. 开发者工具的暖心提示语
  16. Unity打造科技风智慧城市夜景教程
  17. 圆柱体积怎么算立方公式_四个计算圆柱的体积常用公式(附例题)
  18. 物联网技术概论:第7章
  19. SolidWorks二次开发-关于录制宏保存的格式
  20. 华为云服务器默认jdk版本,华为云服务器centos7.3 安装jdk

热门文章

  1. 基于JAVA+SpringMVC+Mybatis+MYSQL的闲置物品交易平台
  2. 高阶多项式合并同类项程序c语言,c语言实现两多项式相乘并排序合并同类项.doc...
  3. 每天5分钟玩转kubernetes_DNS 访问 Service 每天5分钟玩转 Docker 容器技术(138)
  4. 机器学习 -- 用户画像
  5. [转载]linux下上传文件真的需要ftp么?
  6. wpf和winform的那点区别
  7. QT “error: error writing to -: Invalid argument”
  8. jQuery.ajax()方法
  9. Android官方api的下载
  10. LWP 轻量级线程的意义与实现