数据库
首页 > 数据库> > SparkSQL连接查询中的谓词下推处理(2)

SparkSQL连接查询中的谓词下推处理(2)

作者:互联网

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

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

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

1、左表join后条件下推

select 
    a.id,
    a.value,
    b.vlaue
from lefttable a
left join righttable b
    on a.id = b.id
where a.id > 1

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

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

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

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

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

select
    a.id,
    a.value,
    b.value
from (select id,value from lefttable 
      where a.id > 1
    ) a
left join righttable b
    on a.id = b.id

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

2、左表join中条件不下推

select 
    a.id,
    a.value,
    b.value
from lefttable a
left join righttable b
    on a.id = b.id and a.id > 1

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

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

首先左表经过a.id > 1过滤后,如下

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

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

3、右表join中条件下推

select
    a.id,
    a.value
from lefttable a
left join righttable b
    on a.id = b.id
where b.id > 1

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

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

那么如果不下推,其流程如下:

可见,右表join中条件下不不推结果都一样,所以下推优化效果会更好,SparkSQL中的等价处理语句是:

select
    a.id,
    a.value,
    b.value
from lefttable a
left join (select id,value from rigthtable
    where id > 1
    ) b
on a.id = b.id

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

4、右表join中条件不下推

select
    a.id,
    a.value
from lefttable a
left join righttable b
    on a.id = b.id
where a.id > 1

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

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

接下来看看右表join后条件下推的情况

结果如下:

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

总结

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

 

 

 

标签:join,下推,value,查询,右表,SparkSQL,谓词,左表,id
来源: https://blog.csdn.net/LINBE_blazers/article/details/100805090