MaxCompute 费用暴涨之新增SQL分区裁剪失败
现象:因业务需求新增了SQL任务,这SQL扫描的表为分区表,且SQL条件里表只指定了一个分区,按指定的分区来看数据量并不大,但是SQL的费用非常高。费用比预想的结果相差几倍甚至10倍以上。
分析:我们先明确MaxCompute SQL后付费的计费公式:一条SQL执行的费用=扫描输入量 ️ SQL复杂度 ️ 0.3(¥/GB)。
变量主要是输入量和复杂度,但实际上复杂度最高也就为4,由复杂度引起的费用暴涨是比较罕见,我们不妨先把排查重点放在输入量上。
排查:
查看Logview的inputs信息
如上图会发现input的分区量是14个,这个与预想的(SQL条件中只指定一个分区)不一致。问题就出在这里,此时基本可以判断这个SQL的分区并没有裁剪好,也就是说最终输入量不是一个分区而是多个或者全表。
输入的分区量和预计的不一致,排除SQL中确实没有对分区设置条件这因素,那么就是分区裁剪失效了。
已知的分区裁剪失效场景主要有:分区条件用了自定义函数进行裁剪;在 Join 关联时的 Where 条件中也有可能会失效。
执行explain sql语句;
看执行结果,读取的分区都有哪些,如执行explain select seller_id from xxxxx_trd_slr_ord_1d where ds=rand();
结果如下:
看上图中红框的内容,表示读取了表 xxxxx_trd_slr_ord_1d 的 1344 个分区,即该表的所有分区,如果直接执行这个sql,最终会因为全表扫描导致输入量增加从而费用增加。
关于分区裁剪失败场景(使用函数或者跟join关联有关的场景)分析可以参考文档《分区剪裁合理性评估》。大家在执行sql前如果对分区的裁剪有疑虑,不放执行一次explain sql语句;
再执行SQL语句。
关于分区条件用自定义函数或者内置函数导致分区裁剪失效的解决方案:
- 内置函数目前已经都支持进行分区裁剪。
自定义函数需要支持分区裁剪有两种方式:
- 在编写UDF的时候,UDF类上加入Annotation。
@com.aliyun.odps.udf.annotation.UdfProperty(isDeterministic=true)
注意: com.aliyun.odps.udf.annotation.UdfProperty定义在odps-sdk-udf.jar文件中。您需要把引用的odps-sdk-udf版本提高到0.30.x或以上。
- 在SQL语句前设置Flag:
set odps.sql.udf.ppr.deterministic = true;
,此时SQL中所有的UDF均被视为deterministic。该操作执行的原理是做执行结果回填,但是结果回填存在限制,即最多回填1000个Partition。
因此,如果UDF类加入Annotation,则可能会导致出现超过1000个回填结果的报错。此时您如果需要忽视此错误,可以通过设置Flag:set odps.sql.udf.ppr.to.subquery = false;
全局关闭此功能。关闭后,UDF分区裁剪也会失效。
- 在编写UDF的时候,UDF类上加入Annotation。
原文链接
本文为云栖社区原创内容,未经允许不得转载。
MaxCompute 费用暴涨之新增SQL分区裁剪失败相关推荐
- 从MapReduce的执行来看如何优化MaxCompute(原ODPS) SQL
摘要: SQL基础有这些操作(按照执行顺序来排列): from join(left join, right join, inner join, outer join ,semi join) where ...
- 从MapReduce的执行来看如何优化MaxCompute(原ODPS) SQL 1
摘要: SQL基础有这些操作(按照执行顺序来排列): from join(left join, right join, inner join, outer join ,semi join) where ...
- lisp 读取dwg 统计信息_用阿里云交易和账单管理API实现MaxCompute费用对账分摊统计...
利用MaxCompute InformationSchema与阿里云交易和账单管理API 实现MaxCompute费用对账分摊统计 一.需求场景分析 很多的企业用户选择MaxCompute按量付费模式 ...
- 图文理解 Spark 3.0 的动态分区裁剪优化
Spark 3.0 为我们带来了许多令人期待的特性.动态分区裁剪(dynamic partition pruning)就是其中之一.本文将通过图文的形式来带大家理解什么是动态分区裁剪. Spark 中 ...
- select weui 动态加载数据_浪尖以案例聊聊spark3的动态分区裁剪
动态分区裁剪,其实就牵涉到谓词下推,希望在读本文之前,你已经掌握了什么叫做谓词下推执行. SparkSql 中外连接查询中的谓词下推规则 动态分区裁剪比谓词下推更复杂点,因为他会整合维表的过滤条件,生 ...
- mysql 每日新增表分区
1.创建表和表分区 DROP TABLE zy.time_partition; CREATE TABLE zy.time_partition (TIME DATETIME NOT NULL )ENGI ...
- oracle sql 分区查询语句_Oracle SQL调优之分区表
一.分区表简介 分区通过让您将它们分解为更小且更易于管理的分区(称为分区)来解决支持非常大的表和索引的关键问题.不需要修改SQL查询和DML语句以访问分区表.但是,在定义分区之后,DDL语句可以访问和 ...
- 【spark系列9】spark 的动态分区裁剪上(Dynamic partition pruning)-逻辑计划
背景 本文基于delta 0.7.0 spark 3.0.1 spark 3.x引入了动态分区裁剪,今天我们分析以下代码是怎么实现的 分析 直接定位到PartitionPruning.applyPar ...
- 磁盘及分区详解(MBR和GPT)、新增磁盘分区总体示例
磁盘及分区详解(MBR和GPT) 1.磁盘为什么要分区? 2.Linux设备文件 3.磁盘简介 3.1 硬盘接口类型 3.2 机械硬盘和固态硬盘 3.2.1 磁盘术语 3.2.2 机械硬盘 4.分区方 ...
最新文章
- idea显示初始界面_Python基础 PyCharm 的初始设置
- fastjson json串转list
- 调用webservice 设置超时时间
- 服务器系统内存,服务器系统内存使用情况
- 【AD】AD19/20笔记及快捷键
- 什么是php渲染,php数据渲染输出
- (转自孟岩的CSDN)理解矩阵
- Bootstrap 按钮的使用
- 从Curator实现分布式锁的源码再到羊群效应
- 纯CSS实现的3D翻页效果
- The early bird catches the worm!
- html中怎么录音,HTML5怎么实现录音和播放功能
- LPC1768 IAR环境下使用完整64K内存的方法
- 购物车原生js简单明了
- 检查图片是否空白图片
- AcWing 3725. 卖罐头 有意思的数学推导 思维
- c语言破解rar5文件,RAR5 文件格式解析
- Connect internal only, until freed错误处理
- linux安装pycharm报错:Unable to detect graphics environment
- 环境变量:系统变量和用户变量
热门文章
- android 开源 数据库,Android开源数据库框架-LitePal的使用
- python语言浮点数可以不带小数部分吗_python 浮点数四舍五入需要注意的地方
- java substring截取字符串_lt;12gt;深入了解字符串
- 【LeetCode笔记 - 每日一题】318. 最大单词长度乘积(Java、位运算)
- gns3中两个路由器分别连接主机然后分析ip数据转发报文arp协议_ARP协议在同网段及跨网段下的工作原理...
- linux显示点阵字体,Fedora 17中文字体显示点阵状的解决方法
- php强制cookies,php Cookies操作类(附源码)
- 杨振宁在物理学界的地位和成就
- 一位女博士五年的艰难毕业历程
- 优秀!读博期间一作发10篇1区SCI,他坦言自己也曾走过弯路