部分用户(尤其对外输出)使用MaxCompute(原Odps)时,由于对产品的使用层面和执行层面了解程度不同,导致提交的任务执行时间过长、占用了较多集群资源;严重的会导致失败、不仅需要投入支持同学精力协助解决、也影响了用户正常业务。 合并整理部分性能提升方法方便支持用户查询和优化Sql,提高效率;部分需要原来手动调优的如mapjoin、ppd谓词下推注意分区位置等原有的调优设置在不断衍进的产品中都已实现了自动化调优、 不同阶段的产品调优参数和细节会有不一致、但是熟悉了调优思路和方法后可以做到举一反三、逐步深入。

一. 整体思路

整体上,调优从底层到sql可以有多个层面的调优,随着产品的不断完善,部分调优已经实现了自动化。如果用户能熟悉常见的调优机制和执行原理,在开发执行sql、业务逻辑和相关参数设置调整来提高性能、可以做到事半功倍。
      1. 硬件及操作系统层面调优:包括磁盘I/O调优(多路复用等)、网络调优(缓冲区大小、连接数放大等)、内存调优(虚拟内存设置、内存控制等);
      2. 分布式计算平台及存储层面调优:存储格式设置、压缩格式设置、RPC调用设置、连接数控制设置、调度机制设置、block及分片设置、执行资源设置等;
      3. 业务逻辑层面及参数调整,除整体执行的调优外,对不同类型的操作进行参数级别的调优、针对聚合、连接、一读多写等修改为不同的sql或者设置不同的参数可以极大的提高性能;      
      4. Sql层面及应用层面的调优,重构sql写法、合并sql,大小表连接修改为mapjoin等,在odps2.0中已处理了自动mapjoin等、目前未升级用户及对外输出的用户仍需要修改sql来支持;
      不同层面调优及优缺点见下:

二. 场景及调优列举

1. 大小表关联修改为mapjoin,增加Mapjoin hint
方法及注意事项:

  • 所有指定的小表占用的内存总和不超过 512M
  • 多表Join时,最左边的两个表,不能同时是 Mapjoin 的表
  • 不同的关联方式(left/right/inner),对表的顺序有要求
    • left outer join 左表必须为大表
    • right outer join 右表必须为大表
    • inner join 左右表皆可为大表
  • full outer join 不能直接使用 mapjoin,修改为mapjoin + union all
  • 最新的发布版本上已经支持了automapjoin,可以根据join表的大小自动把小表转为mapjoin,对部分没有显示增加hint的sql和中间结果为小表的sql进行自动优化

2. 数据倾斜
数据倾斜表现:
任务进度长时间维持在99%,查看监控,只有少量 reduce 子任务未完成
单一 reduce 记录数与平均记录数差异多大,最长时长远大于平均时长
优化方法及注意事项:

  • 聚合倾斜,设置参数:set odps.sql.groupby.skewindata=true
  • 关联倾斜,设置参数:set odps.sql.skewinfo=tab1:(col1,col2)[(v1,v2),(v3,v4),...|(v1,v2),(v3,v4),...];set odps.sql.optimize.skewjoin=true
  • 关联倾斜,同时大小表,考虑修改为mapjoin
  • 具体问题具体分析:因为聚合key值null引起的数据倾斜,可以修改null为随机值,打撒数据分发到不同的instance执行

3.小文件过多-动态分区生成,减少小文件的生成
方法及注意事项:

  • 设置参数:set odps.sql.reshuffle.dynamicpt=true
  • 能使用静态分区时推荐使用静态分区
  • 打开该参数选项会增加一级reduce,消耗额外资源
  • 要注意参数使用过程中可能出现的数据倾斜
  • 动态分区数较少时建议关闭该参数(False)

4. 小文件过多合并
方法及注意事项:

  • 合并小文件方式:

    • ALTER 合并模式: alter table … [partition] merge smallfiles;
    • SQL 合并模式: odps.task.merge.enable=true
  • 调整参数控制合并的效果
    • 是否允许跨路径合并(false): odps.merge.cross.paths
    • 小文件阀值(32M): odps.merge.smallfile.filesize.threshold
    • 合并输出文件大小(500M) :odps.merge.maxmerged.filesize.threshold
    • 单instance允许合并文件数(200):odps.merge.max.filenumber.per.instance
    • 合并最大的小文件个数(50000) :odps.merge.max.filenumber.per.instance
    • 小文件合并的超时时间(600S):odps.task.merge.wait.for.fuxi.timeout
    • 一次提交SQL最多可以合并分区的个数(20):odps.merge.max.partition.count
    • 如果 sessiion 和 project 均设置了上述参数,则以 session 设置为准

5. Map 端一读多写
场景及优化:
多次读取同一张物理表,执行不同操作,写入多张表;考虑与multiinsert 的联系和区别,是否合适做修改
建立临时表,实现临时表的并行化
注意事项:

  • 优点:大大节省了集群的计算资源和磁盘I/O资源
  • 缺点:写的次数非常多时,可能导致性能问题,影响任务整体执行效率

6. 分区裁剪
场景:事实表很多分区,数据量大
优化:避免全表扫描,减少资源浪费;关注分区裁剪有无生效,见下注意事项:从表设计、使用上注意,尽量让分区裁剪生效
注意事项:

  • 过滤条件中的分区列上有UDF 则分区裁剪生效
  • 表关联时关联条件中包含分区列:
    • 出现在 on 条件中,分区裁剪生效
    • 出现在 where 条件中,主表分区裁剪生效,其余可能失败

7. SQL 合并
场景:
1. 多次读取相同的数据且源数据数据量大、性能差、费用高
2. 统一业务流程前后关联sql或统计多种指标、筛选不同数据的sql
优化方法及注意事项:通过修改sql,合并为1个sql执行,尽量减少对相同数据源的读取次数,达到一次扫描计算多个基础统计量,一次扫描,处理多个筛选条件;以下调整列举:

  • CASE … WHEN…:合并相同数据源的不同子查询的关联
  • 动态分区&多路插入等:将满足不同条件的会员统计信息插入到不同的表或表分区中去
  • 前后流程sql合并为1个sql执行

8. 使用窗口函数优化SQL
窗口函数:
1. 可以进行灵活的分析处理工作
2. 使用 partition by 开窗,order by 排序
3. 可以用 rows 指定开窗范围
4. 丰富的开窗函数

优化及注意事项:合理使用窗口函数,可以减少Join次数,提高运行性能;不用窗口函数处理需要写复杂sql的功能,用开窗函数可以高效执行得到预期结果。

三. 相关参数含义及缺省值

转自:https://blog.csdn.net/bengsa2291/article/details/62216514

Maxcompute Sql性能调优(1)相关推荐

  1. DB2 SQL性能调优秘笈pdf

    下载地址:网盘下载 简介 编辑 <DB2 SQL性能调优秘笈>是一本不可多得的DB2数据库性能调优秘笈,由拥有20余年DB2工作经验的资深数据库专家撰写,Amazon全五星评价畅销书.&l ...

  2. Azure SQL性能调优实践

    Azure SQL性能调优实践 注:blog具备时效性,所有内容都是在当前时间为准,截止时间2017-6-5 首先,创建了一个测试数据库 MaxAadventureWorkTest 使用了 示例数据库 ...

  3. DB2 SQL性能调优秘笈

    <DB2 SQL性能调优秘笈> 基本信息 作者: (美)Tony Andrews 译者: 陈勇 杨健康 丛书名: 华章程序员书库 出版社:机械工业出版社 ISBN:978711142502 ...

  4. SQL优化二(SQL性能调优)

    一·.前言:这篇博文内容非原创,是我们公司的架构师给我们做技术培训的时候讲的内容,我稍微整理了下,借花献佛.这篇博文只是做一个大概的科普介绍,毕竟SQL优化的知识太大了,几乎可以用一本书来介绍.另外, ...

  5. 39个必知必会的SQL 性能调优方法

    1.选择最有效率的表名顺序(只在基于规则的优化器中有效) ORACLE 的解析器按照从右到左的顺序处理FROM子句中的表名,FROM子句中写在最后的表(基础表 driving table)将被最先处理 ...

  6. Oracle SQL性能调优之 -降龙十八掌

    1     前言- 2  2     总纲- 2  3     降龙十八掌- 3  第一掌 避免对列的操作- 3  第二掌 避免不必要的类型转换- 4  第三掌 增加查询的范围限制- 4  第四掌 尽 ...

  7. server sql top速度变慢解决方案_SQL Server的性能调优:解决查询速度慢的五种方法-数据库...

    编辑推荐: 本文主要通过一下几个方面介绍:使用SQL DMV查找慢速查询.通过APM解决方案查询报告.SQL Server扩展事件.SQL Azure查询性能洞察等相关内容. 本文来自博客园,由火龙果 ...

  8. MySQL 性能调优和优化技巧

    介绍 MySQL 是一种流行的开源数据库应用程序,它以一种有意义且易于访问的方式存储和构造数据.对于大型应用程序,庞大的数据量可能会导致性能问题. 本指南提供了一些关于如何提高 MySQL 数据库性能 ...

  9. Mysql数据库性能调优面试大全经典分析

    1.为啥要死磕Mysql Mysql作为一款大众免费开源的关系型数据库软件,受到国内很多"穷屌丝"企业的热烈欢迎,看一下目前最新数据库排行,Mysql排在第二位,仅此于Oracle ...

  10. 《T-SQL性能调优秘笈——基于SQL Server 2012 窗口函数》——1.7 小结

    本节书摘来自异步社区出版社<T-SQL性能调优秘笈--基于SQL Server 2012 窗口函数>一书中的第1章,第1.7节,作者: [美]Itzik Ben-Gan,更多章节内容可以访 ...

最新文章

  1. HDU3007(最小圆覆盖问题)
  2. 关于学习Python的一点学习总结(45->反运算)
  3. TextBox灵异事件之背后神秘的深度灵异事件真相揭秘
  4. Android Logcat的使用
  5. Yii的Querybuild ActiveRecord
  6. sqlserver中查找长时间未提交事务
  7. 解决方案 | office导出为pdf并加密
  8. java11开源中国,Java 11 正式发布!
  9. python:copy()和deepcopy()区别
  10. android导入项目j,如何使用AndroidStudio将开源项目library发布到jcenter
  11. C#程序通过模板自动创建Word文档.doc
  12. openopc.opcerror: dispatch: 无效的类字符串_实战PyQt5: 064-MV框架中的Model类
  13. SpringBoot引入Redis
  14. ip设计包括什么_一天卖200多万个潮玩,泡泡玛特如何打造超级IP?
  15. 计算机辅助教学:多媒体课件制作教程,多媒体课件制作5步曲!
  16. 扶贫计算机考试试题,计算机基础知识试题1.doc
  17. 期望和方差的定义与性质
  18. 《仙剑奇侠传3》全攻略
  19. server酱php推送代码,多种语言调用Server酱推送微信模板消息
  20. 第3章 栈和队列 练习题

热门文章

  1. 血手耳机与笔记本驱动冲突
  2. 安装 smartgit
  3. 害怕字体侵权?可以免费商用的字体库来了!
  4. 罗斯蒙特214CRTSMB1S3M0420SLM2AR1C1B1TBM2温度传感器
  5. python 录音vad_python---webRTC~vad静音检测-学习笔记
  6. Linux文件误删的恢复
  7. matlab迭代法求超越方程,matlab fsolve函数求解超越方程
  8. 划分离散数学定义_《离散数学》学习记录 - 集合论
  9. Python中使用wxpy定时机器人给微信好友发送每日一文
  10. 【实践案例分享】58的商业DMP数据管理平台的架构与实践