MaxcomputerSQL 优化| 学习笔记

本文涉及的产品
云原生大数据计算服务 MaxCompute,5000CU*H 100GB 3个月
云原生大数据计算服务MaxCompute,500CU*H 100GB 3个月
简介: 快速学习 MaxcomputerSQL 优化

开发者学堂课程【MaxCompute 行业应用及调优MaxcomputerSQL 优化】学习笔记,与课程紧密联系,让用户快速学习知识。

课程地址https://developer.aliyun.com/learning/course/88/detail/1350


MaxcomputerSQL 优化


内容介绍

.SQL 成本计算

.SQL IO 读取优化

.SQL 计算优化

.整体优化

 

一、SQL 计算成本

SQL 运行过程:

用户写了一个 sql 然后就会传入到我们的平台,就会有一个编译器进行语法解析,语法解析之后就会生成一个逻辑 plan

然后会有一个优化器,对它进行各种逻辑优化和物理优化,最终生成一个可执行的plan

然后这个 plan 就会把它交给资源调度器,调度器启动作业管理器来管理这个 plan  的执行,

作业管理器总共会启动两个 task,来执行这个 sql,两个 task 直接是有数据依赖关系的,

task1 执行完了 task2 才能执行,每一个 task 会有很多阶层来执行,数据文件的读写就会使用分布式文件系统,来进行文件的读写,这就是整个 sql 的运行的整个机制。

我们如何优化一个sql,让优化器更好的识别它,更好的做出更优化的执行 plan,并且能在执行计算阶段,更好的节省资源。

 

计算方法:

①读取 IO 数据量,从你读取的表数据出发。

Sql 复杂度由 Sql 里面多少耗资源的算子组成,越多复杂度越高,

算子比较耗资源的如:

join/Groud by/order by/distinct/window func/insert into因此优化 SQL 的过程,实际上就是要尽可能减少 IO 读取,尽可能减少计算资源使用,尽可能降低 SQL 复杂度,尽可能提升运行速度。


.优化过程

SQL IO 读取优化

1.建立分区

建立分区表,一般数据比较大就是要建表,但是分区层次不要太多,允许的最大量是六级,一般三级就可以,太多就把数据切得太小了。

 2.分区裁剪

①避免全表扫描,减少资源浪费

casewhere pt=xxx and region=xxx

③分区尽量按层级顺序裁剪

④分区值尽量常量化,避免不可确定值,如 UDF

⑤分区值尽量避免引用列的表达式计算或者子查询

 3.写分区

①写入静态分区,优化数据存储

②避免动态分区,防止文件过多和计算长尾

4.只引用有效列

①避免 select from xxx

②常量代替引用列,如 countc_count1//c not null

 5.尽可能 pushdown 过滤条件

where aandb1or c 1

6.limit N.只读取需要的数据然后就停止。

 6.源表合并

1.合并不同 Sql,一读多计算

①读取相同源表可合并,节省 IQ 和计算资源

②对源表统计多种指标计算或者筛选不同数据处理

③避免规模过大,运行时间过长

2.Multi insert,动态分区,一读多写

①同一 sql 读取相同源表,系统会优化只读取一次

②资源足够,也可以考虑拆分 sql,读取和计算更好并行,资源换时间

3.子查询合并

①对于 sql 中相同的子查询也会合并成一个源

②尽可能保持子查询语句一样,触发合并


.SQL 计算优化

Join连接_Mapjoin优化

1.运行原理

①小表数据全部加载内存

②读取大表的每个task加载一份小表数据

 2.Case1:大小表数据相差大,小表满足限制条件

①静态维度表,轻度汇总表等

②大小表数据量相差越大越有优势,越能节省 IO

 3.Case2.不等值条件,or 条件等复杂 on 条件

①显性指定 mapioin

②不支持其他关联方式

 4.Case3autoMapjoin

Case4:数据倾斜,导致长尾

表现:极少数joiner进程处理数据量远大于其他进程,运行时间过长

原因:

①热点 keyNull值,空值,缺省值,大 key 值等

②数据分发不均衡:数据属性,压缩率不均等

③建表不合理

操作:

热点 key 尽量先去重或过滤无效值

对一些热点缺省无效值加一个随机前缀,分散数据

修改 SQL 隔离热点 key 和非热点 key 分别做关联,再 union all 起来

显性指定mapjoin

增加源表作为大表的并发度:set odps.sql.mapper.split.size=128

增加子查询作为大表并发度:set odps.sql.joiner.instances=1111

 

限制条件:

left outer join 的左表必须是大表

right outer join 的右表必须是大表

inner join 左表或右表均可以作为大表

full outer join 不能使用 Mapjoin

Mapjoin 支持小表为子查询

⑥使用 Mapjoin 时,需要引用小表或是子查询时,需要引用别名

Mapjoin 中,可以使用不等值连接或者使用or连接多个条件

最多支持指定8张小表,否则报语法错误

⑦如果使用 Mapjoin,则所用小表占用的内存总和不得超过512MB

多个表 join 时,最左边的两个表不能同时是 Mapjoin 的表

 

.整体优化

①全链路关键节点优化

1.找出关键节点路径上所有 SQL,记录运行时间

2.优化核心节点和依赖节点

3.合理调节,理清并行和串行关系

②单 SQL 作业内部计算节点优化

1.找出 SQL 所有 task 运行时间的关键路径

2.对关键节点进行优化,适当多分配一些资源

长周期指标统计优化

③问题

1.时间太长,累计的数据量太多,如对一年的数据进行统计

2.sql 消耗太多资源,万级别的并发度,甚至超限呢,运行失败

3.容易产生数据倾斜和各种长尾,运行不稳定

④解决方案

1.选取适当的时间维度建立分区表和增量表

2.根据适当的时间维度做中间轻度汇总,生成中间表

3.基于中间汇总表做关联,避免明细关联

4.基于中间汇总表做总汇总

5.也可以根据上次的汇总做累计汇总

 

其他常见问题

1.内存使用过多

①确认是否数据倾斜,解决方案前面有讲述

②单行数据 size 或者字段 size 是否存在超大值,比如 wm_concatmap 等操作

③自定义 UDF 使用内存过多

2.SQL 处理过程中产生的数据量过大

①数据膨胀,如 UDTFjoin 等操作导致

②跨 task 的数据量暴涨,甚至超限

3.UDF 超时或 fail

①用户需检查自定义代码的逻辑是否存在性能瓶颈点

②是否有网络或者文件操作或权益问题

4.JOb 等待运行时间较长

Quota 组资源不足,增加资源或者释放占用的资源

②集群超负载运行,等待资源释放

5.长尾现象

①数据倾斜

②单台机器资源竞抢严重,如 CPU 负载过重

③读写慢,碰到慢盘

④单个 task 运行失败,重跑

相关实践学习
基于MaxCompute的热门话题分析
本实验围绕社交用户发布的文章做了详尽的分析,通过分析能得到用户群体年龄分布,性别分布,地理位置分布,以及热门话题的热度。
SaaS 模式云数据仓库必修课
本课程由阿里云开发者社区和阿里云大数据团队共同出品,是SaaS模式云原生数据仓库领导者MaxCompute核心课程。本课程由阿里云资深产品和技术专家们从概念到方法,从场景到实践,体系化的将阿里巴巴飞天大数据平台10多年的经过验证的方法与实践深入浅出的讲给开发者们。帮助大数据开发者快速了解并掌握SaaS模式的云原生的数据仓库,助力开发者学习了解先进的技术栈,并能在实际业务中敏捷的进行大数据分析,赋能企业业务。 通过本课程可以了解SaaS模式云原生数据仓库领导者MaxCompute核心功能及典型适用场景,可应用MaxCompute实现数仓搭建,快速进行大数据分析。适合大数据工程师、大数据分析师 大量数据需要处理、存储和管理,需要搭建数据仓库?学它! 没有足够人员和经验来运维大数据平台,不想自建IDC买机器,需要免运维的大数据平台?会SQL就等于会大数据?学它! 想知道大数据用得对不对,想用更少的钱得到持续演进的数仓能力?获得极致弹性的计算资源和更好的性能,以及持续保护数据安全的生产环境?学它! 想要获得灵活的分析能力,快速洞察数据规律特征?想要兼得数据湖的灵活性与数据仓库的成长性?学它! 出品人:阿里云大数据产品及研发团队专家 产品 MaxCompute 官网 https://www.aliyun.com/product/odps 
相关文章
|
监控 算法 测试技术
性能优化之几种常见压测模型及优缺点 | 陈显铭
上一篇讲的是《性能优化的常见模式及趋势》,今天接着讲集中常见的压测模型。通过上一章我们大概知道了性能优化的一些招式,但是怎么发现有性能问题,常见的模式还是需要压测。
5824 0
|
2月前
|
监控 网络协议 Linux
Linux系统管理与优化技巧:提升性能与效率的深度探索
【7月更文挑战第24天】Linux系统管理与优化是一个持续的过程,需要管理员和开发者不断地学习和实践。通过合理的系统监控、内存管理、文件系统优化、进程与任务管理、网络优化以及软件与包管理,可以显著提升Linux系统的性能和效率,确保业务的稳定运行。希望本文的技巧能为广大Linux用户带来帮助,共同推动Linux生态的繁荣发展。
|
4月前
|
缓存 编译器 数据处理
【C/C++ 性能优化】循环展开在C++中的艺术:提升性能的策略与实践
【C/C++ 性能优化】循环展开在C++中的艺术:提升性能的策略与实践
380 0
|
4月前
|
SQL JSON 关系型数据库
selenuim实战优化
该文介绍了如何使用Selenium将数据直接存入MySQL数据库,以苏宁易购网站为例。首先,优化了JSON数据写入,通过pymysql连接数据库,创建`books`表并读取JSON文件插入数据。接着,整合代码实现直接从网页抓取价格和标题,使用Selenium自动化滚动加载页面,定位元素,清洗数据并使用参数化查询插入到`books`表。主程序循环遍历多页数据,最后关闭数据库连接。
28 1
|
3月前
|
存储 JSON 数据格式
如何提升写入效率?Schemaless 写入性能优化实践分享
TDengine 是一款时序数据库,其Schemaless模式适应物联网数据动态变化。通过分析火焰图,发现parser和insert操作是性能瓶颈。优化措施包括减少标签解析、排序和子表生成的重复执行,提前判断schema变更,改进数据插入方法,减少内存分配和拷贝。通过这些优化,如在3.0版本中,line协议性能提升了2.5倍,telnet提升2倍,json提升近5倍。使用工具如火焰图和perf进行性能分析,以识别和解决瓶颈,实现性能提升。
19 0
|
4月前
|
存储 网络协议 Java
服务优化实践
v服务优化实践
36 2
|
4月前
|
存储 缓存 安全
【C/C++ 项目优化实战】 分享几种基础且高效的策略优化和提升代码性能
【C/C++ 项目优化实战】 分享几种基础且高效的策略优化和提升代码性能
258 0
|
Web App开发 JavaScript 前端开发
当我们进行性能优化,我们在优化什么(LightHouse优化实操)
好的互联网产品不仅仅在功能上要高人一筹,在性能层面也需要出类拔萃,否则金玉其外败絮其中,页面是美轮美奂了,结果首屏半天加载不出来,难免让用户乘兴而来,败兴而归。 幸运的是,前端的性能优化有诸多有迹可循的理论和方法,其中相对权威的,无疑是LightHouse。
当我们进行性能优化,我们在优化什么(LightHouse优化实操)
|
运维 监控 网络协议
如何利用性能优化驱动用户体验提升|学习笔记
快速学习如何利用性能优化驱动用户体验提升。
268 0
如何利用性能优化驱动用户体验提升|学习笔记
|
缓存 算法 安全
性能优化:第一章:我们应该怎么优化
性能优化:第一章:我们应该怎么优化
100 0
下一篇
DDNS