0
  • 聊天消息
  • 系统消息
  • 评论与回复
登录后你可以
  • 下载海量资料
  • 学习在线课程
  • 观看技术视频
  • 写文章/发帖/加入社区
会员中心
创作中心

完善资料让更多小伙伴认识你,还能领取20积分哦,立即完善>

3天内不再提示

如何通过explain来验证sql的执行顺序

Linux爱好者 ? 来源:五分钟学大数据 ? 作者:园陌 ? 2021-09-07 16:24 ? 次阅读
加入交流群
微信小助手二维码

扫码添加小助手

加入工程师交流群

关于 sql 语句的执行顺序网上有很多资料,但是大多都没进行验证,并且很多都有点小错误,尤其是对于 select 和 group by 执行的先后顺序,有说 select 先执行,有说 group by 先执行,到底它俩谁先执行呢?

今天我们通过 explain 来验证下 sql 的执行顺序。

在验证之前,先说结论,Hive 中 sql 语句的执行顺序如下:

from 。. where 。. join 。. on 。. select 。. group by 。. select 。. having 。. distinct 。. order by 。. limit 。. union/union all

可以看到 group by 是在两个 select 之间,我们知道 Hive 是默认开启 map 端的 group by 分组的,所以在 map 端是 select 先执行,在 reduce 端是 group by先执行。

下面我们通过一个 sql 语句分析下:

select

sum(b.order_amount) sum_amount,

count(a.userkey) count_user

from user_info a

left join user_order b

on a.idno=b.idno

where a.idno 》 ‘112233’group by a.idno

having count_user》1limit 10;

上面这条 sql 语句是可以成功执行的,我们看下它在 MR 中的执行顺序:

Map 阶段:

执行 from,进行表的查找与加载;

执行 where,注意:sql 语句中 left join 写在 where 之前的,但是实际执行先执行 where 操作,因为 Hive 会对语句进行优化,如果符合谓词下推规则,将进行谓词下推;

执行 left join 操作,按照 key 进行表的关联;

执行输出列的操作,注意: select 后面只有两个字段(order_amount,userkey),此时 Hive 是否只输出这两个字段呢,当然不是,因为 group by 的是 idno,如果只输出 select 的两个字段,后面 group by 将没有办法对 idno 进行分组,所以此时输出的字段有三个:idno,order_amount,userkey;

执行 map 端的 group by,此时的分组方式采用的是哈希分组,按照 idno 分组,进行order_amount 的 sum 操作和 userkey 的 count 操作,最后按照 idno 进行排序(group by 默认会附带排序操作);

Reduce 阶段:

执行 reduce 端的 group by,此时的分组方式采用的是合并分组,对 map 端发来的数据按照 idno 进行分组合并,同时进行聚合操作 sum(order_amount)和 count(userkey);

执行 select,此时输出的就只有 select 的两个字段:sum(order_amount) as sum_amount,count(userkey) as count_user;

执行 having,此时才开始执行 group by 后的 having 操作,对 count_user 进行过滤,注意:因为上一步输出的只有 select 的两个字段了,所以 having 的过滤字段只能是这两个字段;

执行 limit,限制输出的行数为 10。

上面这个执行顺序到底对不对呢,我们可以通过 explain 执行计划来看下,内容过多,我们分阶段来看。

首先看下 sql 语句的执行依赖:

b87621aa-0fb2-11ec-8fb8-12bb97331649.png

我们看到 Stage-5 是根,也就是最先执行 Stage-5,Stage-2 依赖 Stage-5,Stage-0 依赖 Stage-2。

首先执行 Stage-5:

b883ad3e-0fb2-11ec-8fb8-12bb97331649.png

图中标 ① 处是表扫描操作,注意先扫描的 b 表,也就是 left join 后面的表,然后进行过滤操作(图中标 ② 处),我们 sql 语句中是对 a 表进行的过滤,但是 Hive 也会自动对 b 表进行相同的过滤操作,这样可以减少关联的数据量。

接下来执行 Stage-2:

首先是 Map 端操作:

b894d690-0fb2-11ec-8fb8-12bb97331649.png

先扫描 a 表(图中标 ① 处);接下来进行过滤操作 idno 》 ‘112233’(图中标 ② 处);然后进行 left join,关联的 key 是 idno(图中标 ③ 处);执行完关联操作之后会进行输出操作,输出的是三个字段,包括 select 的两个字段加 group by 的一个字段(图中标 ④ 处);然后进行 group by 操作,分组方式是 hash(图中标 ⑤ 处);然后进行排序操作,按照 idno 进行正向排序(图中标 ⑥ 处)。

然后是 Reduce 端操作:

b8a76c38-0fb2-11ec-8fb8-12bb97331649.png

首先进行 group by 操作,注意此时的分组方式是 mergepartial 合并分组(图中标 ① 处);然后进行 select 操作,此时输出的字段只有两个了,输出的行数是 30304 行(图中标 ② 处);接下来执行 having 的过滤操作,过滤出 count_user》1 的字段,输出的行数是 10101 行(图中标 ③ 处);然后进行 limit 限制输出的行数(图中标 ④ 处);图中标 ⑤ 处表示是否对文件压缩,false 不压缩。

执行计划中的数据量只是预测的数据量,不是真实运行的,所以数据可能不准!

最后是 Stage-0 阶段:

b8d9f658-0fb2-11ec-8fb8-12bb97331649.png

限制最终输出的行数为 10 行。

总结

通过上面对 SQL 执行计划的分析,总结以下几点:

每个 stage 都是一个独立的 MR,复杂的 hive sql 语句可以产生多个 stage,可以通过执行计划的描述,看看具体步骤是什么。

对于 group by 的 key,必须是表中的字段,对于 having 的 key,必须是 select 的字段。

order by 是在 select 后执行的,所以 order by 的 key 必须是 select 的字段。

select 最好指明字段,select * 会增加很多不必要的消耗(CPU、IO、内存、网络带宽)。

责任编辑:haq

声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉
  • SQL
    SQL
    +关注

    关注

    1

    文章

    784

    浏览量

    45468
  • 数据库
    +关注

    关注

    7

    文章

    3948

    浏览量

    66792

原文标题:Hive SQL 语句的正确执行顺序

文章出处:【微信号:LinuxHub,微信公众号:Linux爱好者】欢迎添加关注!文章转载请注明出处。

收藏 人收藏
加入交流群
微信小助手二维码

扫码添加小助手

加入工程师交流群

    评论

    相关推荐
    热点推荐

    大促数据库压力激增,如何一眼定位 SQL 执行来源?

    语句成为了性能瓶颈。面对这样的困境,本篇文章提出了对 SQL 进行 “染色” 的方法帮助大家 一眼定位问题 SQL,而无需再在多处逻辑中辗转腾挪 。本文的思路主要受之前郭忠强老师发布的 如何一眼定位
    的头像 发表于 06-10 11:32 ?189次阅读
    大促数据库压力激增,如何一眼定位 <b class='flag-5'>SQL</b> <b class='flag-5'>执行</b>来源?

    CPU的各种指令和执行流程

    在集成电路设计中,CPU的指令是指计算机中央处理单元(CPU)用来执行计算任务的基本操作指令集。这些指令是CPU能够理解并执行的二进制代码,它们在计算机内部由硬件控制并按顺序执行,从而
    的头像 发表于 04-18 11:24 ?1013次阅读

    如何一眼定位SQL的代码来源:一款SQL染色标记的简易MyBatis插件

    作者:京东物流 郭忠强 导语 本文分析了后端研发和运维在日常工作中所面临的线上SQL定位排查痛点,基于姓名贴的灵感,设计和开发了一款SQL染色标记的MyBatis插件。该插件轻量高效,对业务代码无
    的头像 发表于 03-05 11:36 ?484次阅读
    如何一眼定位<b class='flag-5'>SQL</b>的代码来源:一款<b class='flag-5'>SQL</b>染色标记的简易MyBatis插件

    如何通过实验测试验证电源滤波器的设计符合预期的性能指标

    电源滤波器在电子设备中至关重要,需通过严谨实验测试验证设计。测试涵盖插入损耗、通带特性、阻带衰减等性能指标,还需进行可靠性测试,确保滤波器长期稳定运行。
    的头像 发表于 02-14 15:31 ?462次阅读
    如何<b class='flag-5'>通过</b>实验测试<b class='flag-5'>来</b><b class='flag-5'>验证</b>电源滤波器的设计符合预期的性能指标

    Devart: dbForge Compare Bundle for SQL Server—比较SQL数据库最简单、最准确的方法

    、备份和脚本文件夹中的数据差异。它可以同步任意数量数据库中的数据,只需点击几下即可恢复损坏或丢失的数据。 dbForge模式比较 帮助比较数据库模式,分析差异,并通过SQL脚本同步差异。它适用于所有
    的头像 发表于 01-17 11:35 ?610次阅读

    dbForge Studio For SQL Server:用于有效开发的最佳SQL Server集成开发环境

    dbForge Studio For SQL Server:用于有效开发的最佳SQL Server集成开发环境 SQL编码助手 SQL代码分析 查询分析器 可视化查询生成器 数据和模式
    的头像 发表于 01-16 10:36 ?819次阅读

    Devart::dbForge SQL Complete让生产力上一个台阶

    工作效率而定制的。 使用SQL Complete的主要原因 干净、高质量的代码 使用智能感知代码补全,开发纯净的、没有错误的代码。 提高生产率 使用丰富的内置代码段集合,修改和/或创建自定义代码段,使您的编码速度翻倍。 早期错误检测 使用高级T-
    的头像 发表于 01-14 11:09 ?715次阅读
    Devart::dbForge <b class='flag-5'>SQL</b> Complete让生产力上一个台阶

    通过Skyvia Connect SQL终端节点访问任何数据

    通过 Skyvia Connect SQL 终端节点访问任何数据 ? 通过 Skyvia Connect SQL 终端节点访问任何数据ADO.NET 数据网关 使用 Skyvia Co
    的头像 发表于 01-02 09:31 ?415次阅读
    <b class='flag-5'>通过</b>Skyvia Connect <b class='flag-5'>SQL</b>终端节点访问任何数据

    浅谈SQL优化小技巧

    存储在缓存中的数据; (3)未命中缓存后,MySQL通过关键字将SQL语句进行解析,并生成一颗对应的解析树,MySQL解析器将使用MySQL语法进行验证和解析。 例如,验证是否使用了错
    的头像 发表于 12-25 09:59 ?942次阅读

    网线接线顺序

    网线的接线顺序一般遵循TIA/EIA 568B或TIA/EIA 568A标准。以下是这两种标准的详细接线顺序: TIA/EIA 568B标准 TIA/EIA 568B标准是最常用的网线接线顺序之一
    的头像 发表于 12-03 09:40 ?4391次阅读

    SQL错误代码及解决方案

    SQL数据库开发和管理中,常见的错误代码及其解决方案可以归纳如下: 一、语法错误(Syntax Errors) 错误代码 :无特定代码,但通常会在错误消息中明确指出是语法错误。 原因 :SQL语句
    的头像 发表于 11-19 10:21 ?6870次阅读

    常用SQL函数及其用法

    SQL 函数及其用法: 一、聚合函数(Aggregate Functions) 聚合函数对一组值执行计算,并返回单个值。 COUNT() 用途 :返回匹配指定条件的行数。 示例 : SELECT
    的头像 发表于 11-19 10:18 ?1673次阅读

    SQL与NoSQL的区别

    景。 SQL数据库 SQL数据库,也称为关系型数据库管理系统(RDBMS),是一种基于关系模型的数据库。它使用表格、行和列组织数据,并通过SQL
    的头像 发表于 11-19 10:15 ?705次阅读

    大数据从业者必知必会的Hive SQL调优技巧

    不尽人意。本文针对Hive SQL的性能优化进行深入研究,提出了一系列可行的调优方案,并给出了相应的优化案例和优化前后的SQL代码。通过合理的优化策略和技巧,能够显著提升Hive SQL
    的头像 发表于 09-24 13:30 ?785次阅读

    数据库数据恢复—SQL Server数据库出现823错误的数据恢复案例

    SQL Server数据库故障: SQL Server附加数据库出现错误823,附加数据库失败。数据库没有备份,无法通过备份恢复数据库。 SQL Server数据库出现823错误的
    的头像 发表于 09-20 11:46 ?744次阅读
    数据库数据恢复—<b class='flag-5'>SQL</b> Server数据库出现823错误的数据恢复案例