vlambda博客
学习文章列表

关于MySQL,PostgreSQL,Impala,Spark的执行计划

执行/查询计划老外有三种叫法:Execution plan/query explanation paln/query plan1。这个概念起源于关系型数据库,后来开源OLAP引擎同样follow了RDB的传统,实现了查询计划

⚠️:执行计划是优化器/执行器打算访问数据的步骤,所以实际并没有真的执行

1-MySQL 执行计划

下图是MySQL的执行计划2的例子

关于MySQL,PostgreSQL,Impala,Spark的执行计划

实践中,ref_or_null类型看到的还是比较少的;为什么无须回表的index的要劣于range?举个🌰goods_name字段上有索引,对于 select goods_name from goods where goods_name like '%果%',即便有索引,且无须回表,但是还需要全索引扫描的

MySQL更加详细执行计划输出3,Oracle官网有详细的描述,可前往查看

2-PostgreSQL执行计划

关于MySQL,PostgreSQL,Impala,Spark的执行计划

上图是PostgreSQL的执行计划4的例子,①图和②图的区别是②中增加了analyze参数,该参数会触发当前查询实际执行;③号图中的执行计划可以缩略为④号图,类似编程语言中的函数调用

关于MySQL,PostgreSQL,Impala,Spark的执行计划

关于PostgreSQL中的 seq_scan,index_scan,bitmap scan5

1️⃣seq_scan:全表扫描 when select a LOT of data from a table

2️⃣index_scan:  Index Only Scan  when select a handful of rows

3️⃣bitmap scan :  too much row for an index scan to be efficient but too little for a sequential scan,如下图:

关于MySQL,PostgreSQL,Impala,Spark的执行计划

PostgreSQL的执行计划输出,PostgreSQL官网67有详细的描述,可前往查看

3-impala执行计划

关于impala本身,你必须知道它是一个MPP SQL引擎。impala的执行计划官网上描述的很少,全是俗媚的描述性内容,参考意义不大,阅读impala paper8,观看cloudera出品的教学视频9 是一个更上头的操作,要区分impala的execution plan和execution profile,前者是未执行就可获知,后者需要执行后才能获取

3.1-impala SQL查询流和impala逻辑视图

下图中上半部分来于视频,下半部分来自于论文

关于MySQL,PostgreSQL,Impala,Spark的执行计划

就上图做以下几点说明:

1️⃣ 从SQL查询流中可看出,客户端提交的SQL会被Impala前台编译为执行计划,再交给impala后台执行,最后将查询结果/查询简介返回给客户端

2️⃣ 从Impala逻辑视图中看出,impala逻辑上分为3个模块(虚线圈出):元数据模块+执行模块+存储模块

3️⃣ 上图的下半部分展示了一个SQL在impala的整个生命周期(序号标记了整个生命周期)

3.2-impala执行计划的2个阶段

关于MySQL,PostgreSQL,Impala,Spark的执行计划

上图(上半部分来源于视频,下半部分来源于论文)展示了Impala的执行计划分为2个阶段,

🅰️single node plan : 单机上的执行计划

🅱️distributed node plan : 分布式执行计划,全局内 哪些查询是并行的,哪些是需要数据交换(exchance)的

可以看到distributed plan相对于single plan增加了Exchange,这是因为如果数据分布在不同的节点上,我们需要使用使用类似Grace Hash Join的方式使得相同的key去往同一个节点,这个类似Hive/Spark中shuffle的行为,在impala中标记为exchange,在Spark中也被标记为exchange

4-Spark执行计划

Spark中SQL(DataSet,DataFrame,Cypher)的解析,分析,优化等都是由Catalyst1011完成的,下图是Catalyst的逻辑视图

1️⃣Catalyst会生成多个physical plan,但是最终会选择根据Cost Model(执行时间、资源消耗等)一个

2️⃣Adaptive Query Execution是Spark3.0的功能,Catalyst会在计划执行时收集统计信息,如果发现更好的计划,可以在运行时改变执行计划


🔞Reference

[1]    query plan wiki : https://en.wikipedia.org/wiki/Query_plan

[2]    mysql query plan : https://www.youtube.com/watch?v=9K26Wb84f50

[3]    mysql explain output format: https://dev.mysql.com/doc/refman/8.0/en/explain-output.html

[4]    postgresql query plan : https://www.youtube.com/watch?v=Mll5SqR4RYk&t=632s

[5]    seq_scan,inde_scan,bitmap_scan: https://www.cybertec-postgresql.com/en/postgresql-indexing-index-scan-vs-bitmap-scan-vs-sequential-scan-basics/

[6]    postgresql explain output format : https://www.postgresql.org/docs/10/using-explain.html | ↩

[7]    postgresql performance tuning:  https://www.postgresql.org/docs/8.1/performance-tips.html

[8]    impala parper : http://www.cidrdb.org/cidr2015/Papers/CIDR15_Paper28.pdf

[9]    impala tutorial of cloudera : https://www.youtube.com/watch?v=J0n-yORrmcU

[10]    spark execution video : https://www.youtube.com/watch?v=YgQgJceojJY&list=WL&index=1&t=334s

[11]    spark execution blog : https://medium.com/datalex/sparks-logical-and-physical-plans-when-why-how-and-beyond-8cd1947b605a