分区表查询条件使用浅析

简介: 如果有个分区表,分区列为A、B、C三列,我要查询B列为某些值的数据,MaxCompute还能充分发挥分区表的优势吗?答案是肯定的,MaxCompute依然能发挥分区列的优势!在底层解析SQL执行计划时,只会将符合条件的分区纳入计算,而不是进行全表扫描。

很多同学已经跨入了MaxCompute的殿堂,对分区表和非分区表有了初步了解,也充分意识到“大数据量”的信息表要尽可能的采用分区方式,因为这样在查询、统计、分析的时候,在WHERE条件中可以利用分区列进行过滤,从而提升查询效率,减少不必要的计算开销。有细心的同学就会将问题引申:如果有个分区表,分区列为ABC三列,我要查询B列为某些值的数据,MaxCompute还能充分发挥分区表的优势吗?答案是肯定的,MaxCompute依然能发挥分区列的优势!在底层解析SQL执行计划时,只会将符合条件的分区纳入计算,而不是进行全表扫描。接下来我们用MaxCompute提供的工具来分析下相关SQL的执行效果。

一、数据准备

实验中使用的数据保存在文件《测试分区列过滤.csv》中,共27条记录,分区列为ABC三列。从分区(a=a1,b=b1,c=c1)到分区(a=a3,b=b3,c=c3)共27个分区,每个分区中有1条数据。

47818890c325d81a57f6c894da924c78fcc052b7 

实验数据最终要插入到分区表中,因为Tunnel工具不支持直接将数据导入到分区表,所以我们要通过一个“类似结构”的非分区表搭桥——先将文件中的数据导入到一个非分区表中,然后再使用动态SQL将非分区表的数据插入到分区表中。接下来进行具体操作:

1. 创建中间数据表

DataWorks的【数据开发】中【新建脚本文件】,然后执行下面的建表SQL语句:

-- 创建对应的非分区表

CREATE TABLE temp_test_wfq(

  bh BIGINT COMMENT '编号',

  bt STRING COMMENT '标题',

  a STRING COMMENT '分区列A',

  b STRING COMMENT '分区列B',

  c STRING COMMENT '分区列C'

) COMMENT '测试分区列过滤_无分区' LIFECYCLE 30;

2. 将实验数据导入表【temp_test_wfq】中

将文件《测试分区列过滤.csv》中的样例数据导入中间数据表【temp_test_wfq】中。详细操作参见阿里云官方文档导入本地数据,本文不再赘述。

3. 创建实验使用的分区表

DataWorks的【数据开发】中【新建脚本文件】,然后执行下面的建表SQL语句:

-- 创建分区表,分区列为ABC3

CREATE TABLE temp_test(

  bh BIGINT COMMENT '编号',

  bt STRING COMMENT '标题'

) COMMENT '测试分区列过滤'

PARTITIONED BY (

  a STRING COMMENT '分区列A',

  b STRING COMMENT '分区列B',

  c STRING COMMENT '分区列C'

) LIFECYCLE 30;

4. 使用动态SQL将非分区表中的数据插入到分区表中

在前面操作中,已经将数据导入到了非分区表中,接下来使用动态SQL语句,将非分区表中的数据迁移到分区表中,具体SQL如下:

-- 使用动态SQL,将非分区表中的数据插入到分区表

INSERT OVERWRITE TABLE temp_test PARTITION (a,b,c)

  SELECT * FROM temp_test_wfq

;

5. 确认实验数据已准确插入到分区表中

DataWorks的【数据开发】中【新建脚本文件】,然后执行下面的建表SQL语句:

-- 查询数据表【temp_test】中的数据

SELECT * FROM temp_test ORDER BY bh LIMIT 100;

返回结果应该有27条数据,如下图所示:

6fbb0ea3edd30c2afff34c122e3a0a49675910d3

二、测试分区列过滤

 

为了能够看到SQL的执行计划,需要使用EXPLAIN命令来进行展现分析结果,具体SQL语句如下:

-- 解释SQL

EXPLAIN SELECT * FROM (

SELECT * FROM temp_test WHERE a = 'a1'                  --SQL1:M1_Stg1

UNION ALL

SELECT * FROM temp_test WHERE b = 'b2'                  --SQL2:M2_Stg1

UNION ALL

SELECT * FROM temp_test WHERE c = 'c3'                  --SQL3:M3_Stg1

UNION ALL

SELECT * FROM temp_test WHERE b = 'b1' AND c = 'c2'        --SQL4:M4_Stg1

UNION ALL

SELECT * FROM temp_test WHERE a = 'a3' AND c = 'c1' AND bt LIKE '%b2%'    --SQL5:M5_Stg1

) a;

EXPLAINSQL语句,是将5个子查询的结果UNION后,统一返回一个结果集。最终解释执行计划如下图所示:

{}b0bfffd10bb3be47ac4dc394bad5d28e967b222f

1. Job0解读

上面的EXPLAIN结果我们逐段展开解释:

3eacf6e969c6761006c902bdc549bee1d77921e4

上图中包含了2部分信息:1.job0 is root job】表示该查询语句只转换为了1个作业,所以只有一条关于“job0”的作业信息。2.In Job job0】后续描述了该作业包含的ROOT任务有“M1_Stg1, M4_Stg1, M2_Stg1, M3_Stg1, M5_Stg1”,共5个。

2. Task M1_Stg1解读

In Task M1_Stg1】对应的内容,则详细阐释了此任务的执行语义:

140fd94bfb993bf5d7226b16dcb0fcca86e61b69 

Data source】说明了,该任务的数据源自数据表test_create_projecta.temp_test9个分区,也就是说参与本次运算的数据为这9个分区的数据。仔细观察,还会发现所列出的分区,a列对应的值都是“a1”。

TS】块说明对表“temp_test”进行了“TableScanOperator”操作,SQL语句中对应的部分就是“FROM temp_test”。

FIL】块说明了对数据进行等值过滤,SQL语句相当于“WHERE temp_test.a = 'a1'”。

SEL】块说明了返回的结果数据列,有5列:temp_test.bh, temp_test.bt, temp_test.a, temp_test.b, temp_test.c

UNION】块说明还要跟后续的【SEL】块的查询结果进行UNION操作。

FS】块说明进行最终的输出表操作,因为本条SQL语句没有将结果输出到具体表中,所以输出的目标为“None”。

通过以上分析,该TASK对应的SQL应该是子查询SQL1SELECT * FROM temp_test WHERE a = 'a1'”,最终分区列过滤发挥了作用,参与运算的有9个分区。

3. Task M2_Stg1解读

c0baf9d4c8b642b21d7ffb80a366b70dd116b18e

Data source】说明了,该任务的数据源自数据表test_create_projecta.temp_test9个分区,也就是说参与本次运算的数据为这9个分区的数据。仔细观察,还会发现所列出的分区,b列对应的值都是“b2”。

TS】块说明对表“temp_test”进行了“TableScanOperator”操作,SQL语句中对应的部分就是“FROM temp_test”。

FIL】块说明了对数据进行等值过滤,SQL语句相当于“WHERE temp_test.b = 'b2'”。

SEL】块说明了返回的结果数据列,有5列:temp_test.bh, temp_test.bt, temp_test.a, temp_test.b, temp_test.c

UNION】块说明还要跟后续的【SEL】块的查询结果进行UNION操作。

FS】块说明进行最终的输出表操作,因为本条SQL语句没有将结果输出到具体表中,所以输出的目标为“None”。

通过以上分析,该TASK对应的SQL应该是子查询SQL1SELECT * FROM temp_test WHERE b = 'b2'”,最终分区列B的过滤条件也发挥了作用,只有(b = 'b2')的9个分区参与了运算。

另外3TASK,感兴趣的同学也可以自己深入分析一下,相信对分区列的过滤查询会有更深刻体会。

三、小结

通过上述实验,我们可以直观的看到,分区表进行查询时,WHERE条件中对分区列进行了等值过滤,会很有效的避免了全表参与运算。MaxCompute在解释SQL时,会只将符合条件的分区数据,纳入到运算里面来,从而显著提升了计算效率,节省了运算成本。

 

相关实践学习
基于MaxCompute的热门话题分析
Apsara Clouder大数据专项技能认证配套课程:基于MaxCompute的热门话题分析
相关文章
|
5月前
|
数据采集 算法 前端开发
AR眼镜在安防领域人脸识别技术方案|阿法龙XR云平台
基于AR眼镜的移动安防人脸识别系统,采用端-边-云协同架构,集成高清红外采集、轻量级人脸检测与多模式识别计算,实现毫秒级身份核验。支持本地、云端及执法终端协同比对,结合动态置信度优化与AR信息叠加,适用于大型场馆、边境巡检等场景,提升执法效率与精准度。(238字)
|
2月前
|
存储 小程序 前端开发
开源版婚恋社交系统:基于PHP开发,集成实时音视频匹配、IM聊天、邀约组局与红娘管理模块的小程序!
系统基于uni-app+PHP全开源架构,支持1V1音视频、IM聊天、兴趣组局、红娘匹配等功能,覆盖都市社交、线上相亲、线下活动等多元场景,助力高效交友与婚恋服务,跨端兼容,灵活二开。
214 1
|
10月前
|
机器学习/深度学习 人工智能 自然语言处理
人工智能技术的探讨
人工智能的概念,人工智能的发展,人工智能的各种学派,人工智能的应用领域
407 4
|
6月前
|
JSON API 数据格式
小红书笔记详情API,json数据返回
以下是一个模拟的小红书笔记详情的JSON数据返回示例,包含了笔记的基本信息、作者信息、内容、图片、标签以及互动数据(点赞、评论、收藏)等关键字段:
|
7月前
|
SQL 安全 数据库
Microsoft SQL Server 2017 RTM GDR & CU31 (2025 年 7 月更新)
Microsoft SQL Server 2017 RTM GDR & CU31 (2025 年 7 月更新)
183 0
Microsoft SQL Server 2017 RTM GDR & CU31 (2025 年 7 月更新)
|
6月前
|
JSON 算法 API
拼多多API跨店比价功能,选品效率提升60%!
拼多多推出API跨店比价功能,助力商家与消费者高效选品。通过自动化比价与智能算法,实现选品效率提升60%。开发者可快速集成,优化采购与购物体验。智能高效,抢占市场先机。了解详情:https://o0b.cn/evan
566 0
|
NoSQL 关系型数据库 Go
带你十天轻松搞定 Go 微服务系列(一)
带你十天轻松搞定 Go 微服务系列(一)
|
9月前
|
存储 安全 物联网
RFID工具柜上的应用
RFID工具柜通过为每个工具粘贴RFID标签,结合智能锁具与管理系统,实现工具的高效、精准和智能化管理。它能自动识别工具信息,记录出入库、借用归还等数据,减少人工操作误差。广泛适用于工厂、实验室、职业院校等场景,提升生产效率与安全性。智能权限管理保障工具安全,软件支持快速盘点与数据分析,优化采购与维护决策。RFID技术的应用显著提高了工具管理效率与准确性。
|
人工智能 Linux Docker
一文详解几种常见本地大模型个人知识库工具部署、微调及对比选型(1)
近年来,大模型在AI领域崭露头角,成为技术创新的重要驱动力。从AlphaGo的胜利到GPT系列的推出,大模型展现出了强大的语言生成、理解和多任务处理能力,预示着智能化转型的新阶段。然而,要将大模型的潜力转化为实际生产力,需要克服理论到实践的鸿沟,实现从实验室到现实世界的落地应用。阿里云去年在云栖大会上发布了一系列基于通义大模型的创新应用,标志着大模型技术开始走向大规模商业化和产业化。这些应用展示了大模型在交通、电力、金融、政务、教育等多个行业的广阔应用前景,并揭示了构建具有行业特色的“行业大模型”这一趋势,大模型知识库概念随之诞生。
157820 30
|
消息中间件 资源调度 API
Apache Flink 流批融合技术介绍
本文源自阿里云高级研发工程师周云峰在Apache Asia Community OverCode 2024的分享,内容涵盖从“流批一体”到“流批融合”的演进、技术解决方案及社区进展。流批一体已在API、算子和引擎层面实现统一,但用户仍需手动配置作业模式。流批融合旨在通过动态调整优化策略,自动适应不同场景需求。文章详细介绍了如何通过量化指标(如isProcessingBacklog和isInsertOnly)实现这一目标,并展示了针对不同场景的具体优化措施。此外,还概述了社区当前进展及未来规划,包括将优化方案推向Flink社区、动态调整算子流程结构等。
924 31
Apache Flink 流批融合技术介绍