注:以下图片均引用自2019年阿里云栖大会
Spark发展史
1 动态分区(Dynamic Partition Pruning)
在3.0以前,spark是不支持动态分区的,所谓动态分区就是针对分区表中多个表进行join的时候,在on后面的条件语句满足一定的要求后就会进行自动动态分区裁减优化,比如:
1SELECT t1.id,t2.pKey
2FROM t1
3JOIN t2
4ON t1.pKey = t2.pKey
5AND t2.id < 2;
上面这条SQL语句在没有使用动态分区的情况下执行过程如下图所示:
在使用了动态分区以后执行过程变成了下图:
可以看到之前进行join的时候对t1表中满足on条件的所有数据进行扫描,然后再把两张表进行join,在加入动态分区之后,我们过滤掉了t1表中的无用数据,大大减少了join时的内存计算开销,在实际环境中同样的代码,性能提升了有33倍!
2
自适应查询执行(Adaptive Query Execution)
自适应查询是指对执行计划按照实际数据分布和组织情况,评估其执行所消耗的时间和资源,从而选择代价最小的计划去执行。一般数据库的优化器有两种,一种是基于规则的优化器(RBO)