impala 执行计划详解

article/2025/9/29 4:59:59

Impala是一个MPPMassivelyParallelProcessing计算引擎,简单来说就是将计算压力分到多个节点,得到结果后汇总,然后再返回给客户端。如果你留意过Impala的执行计划,会观察到exchange节点,该节点的作用就是分散计算压力的过程,impala的架构相关,可点击关于MySQL,PostgreSQL,Impala,Spark的执行计划

下面我们通过sql语句 + 截图的方式熟悉下impala的执行计划

查看impala的执行情况有3种途径, 1️⃣ execution planSQL没有实际运行之前就可以获取;2️⃣ profile SQL实际运行之后搜集的执行信息;3️⃣ summary也是SQL实际执行之后搜集的信息相比于profile更加详细

本文将重点探讨第一种execution plan的执行

1️⃣ 常见SQL及其执行计划

测试表表结构及数据状况如下

drop table if exists  test.user;
create table if not exists test.user as
select 1 as user_id , 'z1' as user_name union all
select 2 as user_id , 'z2' as user_name union all
select 3 as user_id , 'z3' as user_name
;
drop table if exists test.goods;
create table if not exists test.goods as
select '001' as goods_id , '手机' as  goods_name union all
select '002' as goods_id , '洗衣机' as  goods_name union all
select '003' as goods_id , '冰箱' as  goods_name ;
;drop table if exists test.order_tb;
create table if not exists test.order_tb as
select 1 as order_no , 1 as user_id , '001' as goods_id union all
select 2 as order_no , 1 as user_id , '002' as goods_id union all
select 3 as order_no , 2 as user_id , '002' as goods_id
;

1.1 select 查询

在这里插入图片描述

简单的select * 操作,exechange中不需要partitioned,且没有搜集表的统计信息,基数cardinality信息不可用unaviable

1.2 group by

在这里插入图片描述

左边的逻辑是执行表扫描之后,进行一次预聚合然后按照user_id的哈希值分发,相同user_id去往同一个节点之后,merge结果;右侧和左侧的区别在于执行了compuate status之后,统计到数据都在一个节点,所以只需要单节点内的聚合

1.3 order by

在这里插入图片描述

左图:首先节点内排序,排序完成后所有节点归并外排即归并排序1。右图中搜集了目标表的统计信息,只需要在单节点内执行排序操作

1.4 windows_function

在这里插入图片描述

左图中首先按照partition by分区字段exechange往不同的节点,然后是排序user_id正序null值排在队首,然后是执行窗口操作,可以观察到实际使用的是rows between unbounded preceding and current row队首到当前行,最后exechange之后返回结果,相比于order by 的排序的区别在于没有最终归并排序的步骤。右图的区别在于搜集到目标表的统计信息后,所有操作在单节点内完成

1.5 join

在这里插入图片描述

左图中:扫描t2表后广播t2表,关联方式为hash join ,关联完成后扫描t3表,广播t3后,和t1关联,关联方式为hash join,最后exechange返回结果。右图中搜集到了各个表的统计信息后,t1和t2关联,之后t3 right join t1表。二者使用的方式都是Hash Join,关于Hash Join可以参考这篇文章单机与分布式下的 Join 是怎么玩的?

在没有收集表信统计信息的情况下,Impala不会知道谁是大表谁是小表,也就无法完成类似Hive优化器那样,总是用小表驱动大表的功能

2️⃣-大表关联

上面描述的表数据量很小,是小表之间的关联,下面描述的是大表之间的关联及其执行计划

  • dwd.live_order_basic_di ,dwd.live_order_goods_di 亿级记录的的大表
  • dim.live_zhubo_user_info_df 小表(千条记录)

2.1 大表关联大表&大表关联小表

在这里插入图片描述

🅰️左图是大表关联小表,可以认为是广播哈希关联

  • 扫描t1表,
  • 扫描t2,exechange的方式是广播
  • t1表和t2表hash join
  • 节点内聚合
  • 按照分组键 anchor_id 执行exechange
  • merge多个节点的结果
  • exechange 给协调器QueryCoordinator

🅱️右图是大表关联大表,可以认为是混洗哈希关联

  • 扫描t1表,并且按照关联键exechange
  • 扫描t2表,并且按照关联键exechange (经过步骤1和步骤2之后,相同的关联键都去往同一个节点)
  • 执行hash join
  • 按照分组键anchor_id聚合(节点内聚合)
  • 按照分组键anchor_id exechange(相同的分组键去往相同的节点)
  • merge多个节点的结果
  • exechange 给协调器QueryCoordinator

下图是两种关联方式的区别:

在这里插入图片描述

2.2-group by + distinct单字段

在这里插入图片描述

上图左图和右图展示了,如果group by A字段,distinct B字段的实际效果就是先group by A, B字段,然后在按照其中一个字段group by,然后执行聚合函数

2.3-group by + distinct多个字段

在这里插入图片描述

如上图所示,如果对多个字段执行distinct,将会有多个分组calss_x同时进行,这对impalad的压力是非常大的,生产环境中多字段distict非常容易把impalad玩坏

3-其他问题

🅰️ 关于为什么有时候执行compute stats tb_name时候,整体脚本更慢?

情况1:执行explain的时候即便没有表的统计信息也会生成一个执行计划,按照该执行计划执行得到耗时为 t i m e _ A time\_A time_A

情况2:假设执行compute stats tb_name的耗时为 t i m e _ B time\_B time_B,但是在执行explain之后得到了和情况1一样的执行计划,此时整体消耗的时间为: t i m e _ A + t i m e _ B time\_A + time\_B time_A+time_B

💁‍♂ 所以一个建议是在涉及大表的查询/关联时,不建议优先执行 compute stats tb_name

Impala在没有收集统计信息的前提下,执行关联有如下逻辑

1️⃣ t1 left join t2exchange (哈希或者广播) t2表

2️⃣ t1 right join t2 , exchange (哈希或者广播) t1表

🅱️ 关于行列剪裁的辨析

projection投影 pushdownpredicate谓词 pushdownruntime filter
列过滤行过滤(更底层的过滤方式)行过滤(运行加载到内存过滤)

关于predicate pushdowruntime filter的区别

This optimization is called filter pushdown or predicate pushdown and aims at pushing down the filtering to the “bare metal”, i.e. a data source engine. That is to increase the performance of queries since the filtering is performed at the very low level rather than dealing with the entire dataset after it has been loaded to Spark’s memory and perhaps causing memory issues.

由于谓词下推predicatePushdown是一种更底层的过滤方式,因此比较于运行时过滤runtimeFilter具备更高的效率

本文首发于公众号stackoverflow,欢迎关注

Reference


  1. 几乎无一例外的,只要涉及到大规模数据的排序,都需要使用归并排序,因为归并排序的优势在于可以突破内存的限制,而且是一个 O ( n ∗ l o g n ) O(n*log^n) O(nlogn)的时间复杂度的排序方式 ↩︎


http://chatgpt.dhexx.cn/article/wPf4duGM.shtml

相关文章

sqlserver 执行计划

一个很好的手册分享,执行计划里的属性解释官方文档:https://docs.microsoft.com/zh-cn/sql/relational-databases/showplan-logical-and-physical-operators-reference?viewsql-server-2017 想复杂的事情简单说,在看执行计划的其他文章的时…

MySQL执行计划

什么是执行计划 The set of operations T that the optimizer o chooses to perform the most efficient query t is called the “query execution plan”, also known as theEXPLAIN plan 如何获取SQL语句的执行计划 方法1: explain SQL 。方法2: …

sql 执行计划

一、各数据库执行计划执行方式 二、explan 三种格式 (以MySQL为例) 1.默认格式 2.tree 格式(与postgreSQL执行计划格式相似) 3.json格式 三、执行计划各字段名含义 1) id:查询编号 ,从小到大,编号越大执行顺序越往前 相同的话从上往下执行(也可以把编号当成缩进的格数…

mysql的执行计划_MySQL——执行计划

项目开发中,性能是我们比较关注的问题,特别是数据库的性能;作为一个开发,经常和SQL语句打交道,想要写出合格的SQL语句,我们需要了解SQL语句在数据库中是如何扫描表、如何使用索引的; MySQL提供explain/desc命令输出执行计划,我们通过执行计划优化SQL语句。 下面我们以M…

Oracle查询执行计划

执行计划(Execution Plan)也叫查询计划(Query Plan),它是数据库执行SQL语句的具体步骤和过程。SQL查询语句的执行计划主要包括: ● 访问表的方式。数据库通过索引或全表扫描等方式访问表中的数据。 ● 多表…

oracle执行计划耗费 基数 字节,Oracle 查看执行计划

一:什么是Oracle执行计划? 执行计划是一条查询语句在Oracle中的执行过程或访问路径的描述 二:怎样查看Oracle执行计划? 这里以PLSQL为例: ①:配置执行计划需要显示的项: 工具 —> 首选项 —> 窗口类型 —> 计划窗口 —> 根据需要配置要显示在执行计…

执行计划绑定方法

执行计划突变属于每个数据库系统不可避免页难以预防的难题,处理执行计划突变带来的性能问题也是每个DBA应该具备的技能。除了开发时针对不同范围的结果集使用不同的sql,DBA可以通过查看索引状态、消除索引碎片、表重新分析,还可以使用执行计划…

PostgreSQL执行计划

简介 PostgreSQL是“世界上最先进的开源关系型数据库”。因为出现较晚,所以客户人群基数较MySQL少,但是发展势头很猛,最大优势是完全开源。 MySQL是“世界上最流行的开源关系型数据库”。当前客户基数大,随着被Oracle收购&#…

一文带你了解SQL的执行计划(explain)

一. 什么是SQL执行计划 为什么关注sql的执行计划,因为一个sql的执行计划可以告诉我们很多关于如何优化sql的信息 。 通过一个sql计划,如何访问中的数据 (是使用全表扫描还是索引查找?) 一个表中可能存在多个表中不同的…

执行计划

一、什么是执行计划(explain plan) 执行计划:一条查询语句在ORACLE中的执行过程或访问路径的描述。 二、如何查看执行计划 1: 在PL/SQL下按F5查看执行计划。第三方工具toad等。 很多人以为PL/SQL的执行计划只能看到基数、优化器、耗费等基本信…

matlab画图基本命令

一、本文主要内容和相关参考博客 参考了xticklabel和xtick在matlab里的区别 和 label ‘ytick’的设置这两个网址。matlab在画图时会自动调整坐标轴间隔的大小,但是我们可以使用如set(gca,ytick,ylabel_pos,yticklabel,ylabel_str)的函数来实现自己调整间隔以画出…

MATLAB常用绘图命令

选择图型窗口命令 坐标轴相关命令 文字标示命令 栅格 离散数据处理

MATLAB画图命令zz

一、散点图 1.1.命令 plot 功能 线性二维图。在线条多于一条时,若用户没有指定使用颜色,则plot循环使用由当前坐标轴颜色顺序属性(current axes ColorOrder property)定义的颜色,以区别不同的…

slice matlab,Matlab画图之slice命令

满意答案 7a6o8yb4 2015.08.12 采纳率:55% 等级:8 已帮助:212人 close all; clc; clear; A = [1 2 2 25 1 3 3 21 1 4 4 20 2 5 5 19 2 6 7 31]; x = A(:, 1); y = A(:, 2); z = A(:, 3); s = A(:, 4); % 提取有效数据 xb = min(x); xe = max(x); yb = min(y); ye = max(…

Matlab画图命令介绍

这是matlab里最基本的命令,帮助那些没有学过matlab,只是用它来画画图的人。

matlab画图句柄

Hf_1figure(color, white);figure全部属性 Alphamap: [0 0.0159 0.0317 0.0476 0.0635 0.0794 … ]BeingDeleted: offBusyAction: queueButtonDownFcn: Children: [00 GraphicsPlaceholder]Clipping: onCloseRequestFcn: closereqColor: [1 1 1]Colormap: [2563 double]Context…

【转载】Matlab画图命令介绍

这是matlab里最基本的命令,帮助那些没有学过matlab,只是用它来画画图的人。

matlab 画图 浓淡有别,matlab画图命令汇总

matlab画图命令汇总(2010-11-16 21:46:24) 转载 一、plot系列 plot  |  plot3  |  plotyy  |  polar(极坐标) 二、image系列 image  |  imagesc  |  pcolor(伪彩图)  | 三、contour系列——等高线图 contour  |  contour3  |  contourc  |  …

matlab绘图命令

1、fplot() 该命令常用来绘制符号函数的图像;其具体格式为: fplot(fun,lims),其中fun是符号函数表达式,lims用来声明绘图区间。 例如: 绘制函数:f(x)sinxx; >> lims[-5,5]>> fplot(sin(x)x,lim…

matlab绘图命令总结(重要!!!整理)

基本的绘图流程: (1)数据准备。 (2)设置当前绘图区。 (3)绘图。 (4)设置图形中曲线和标记点格式。 (5)设置坐标轴和网格线属性。 (6&a…