sql数据处理的长尾问题及优化
长尾问题是分布式计算里最常见的问题之一。主要原因是因为数据分布不均,导致各个节点的工作量不同,整个任务就需要等最慢的节点完成才能完成。
Map长尾
主要原因是某些Map Instance读取的数据量相对于其他的Instance多很多。
优化方法:
- 使用统计好的中间层汇总表,减少大数据量读取;
- 行裁剪:检查代码读取的数据量是不是比自己的需求多,尽可能限制分区或者使用where条件过滤掉不需要的数据;
- 列裁剪:限制select的字段数据,尽量不用select *,列的利用率低。比如原表有100个字段,如果只用了其中1个字段,那么利用率只有1%。对于列数特别多的输入表,Map阶段处理只需要其中的某几列,可以通过在添加输入表时,明确指定输入的列,减少输入量;
- 使用union all:在所取的数据量很大的时候,可以尝试使用union all将所取的数据分开查询并集合在一起。比如要取3个月的数据,则可以分别写三段sql,每段取一个月的数据,再union all起来。
Reduce长尾
主要原因是分发键分布不均匀,存在热点数据(比如按照城市汇总用户量时,某一个城市的用户量占比超过60%,就可能出现Reduce长尾)。
优化方法:
- 使用统计好的中间层汇总表,这一点同Map长尾处理方式一样。
- 行裁剪/列裁剪:这一点也和Map长尾处理方式一样。
- 不同的列进行count distinct操作,造成map端数据膨胀,优化sql语句, 两次group by分多次处理
比如:
SELECT CITY,COUNT(DISTINCT USER_ID) AS USER_COUNT
FROM TABLE
GROUP BY CITY
;
如果长尾发生,可以考虑减少聚合时的数据量,比如可以先对CITY和USER_ID进行group by作为一个子查询,再在外层对CITY进行分组计算,具体优化语句为:
SELECT CITY,COUNT(USER_ID) AS USER_COUNT
FROM (SELECT CITY,USER_IDFROM TABLEGROUP BY CITY,USER_ID)
GROUP BY CITY
;
Join长尾
JOIN阶段会将JOIN Key相同的数据分发到同一个Join Instance上执行处理。如果某个Key上的数据量比较多,会导致该Instance执行时间比其他Instance执行时间长。该JOIN Task的大部分Instance已执行完成,但少数几个Instance一直处于执行中,这种现象称之为Join长尾。
主要原因是表关联的键(key)分布不均匀,存在热点(本质就是关联的时候key值出现1对多的情况,这个多的部分就是热点)。
优化方法:
- 进行关联之前对数据进行去重,或者先对每个表进行分组汇总,尽量使用主键(唯一键)进行关联。
- 两表关联存在热点key:
a、大小表关联,使用Mapjoin,将小表加载到内存,直接分发到Map Instance所在机器上,在读取的阶段就做hash-join。值得注意的是Mapjoin的小表大小有限制,而且小表必须要是从表(即不能是left join的左表,也不能是right join的右表)。
比如:假设表a左关联表b,b是小表:
SELECT a.id,b.name
FROM a
LEFT OUTER JOIN b
ON a.id = b.id
;
转化为:
SELECT /*+mapjoin(b)*/a.id,b.name
FROM a
LEFT OUTER JOIN b
ON a.id = b.id
;
如果大小表关联,而小表是主表,此时无法使用mapjoin,参考如下处理方式:
先将小表和大表利用MAP JOIN进行inner join,得到小表和大表的交集中间表,且这个中间表一定是不大于大表的(key倾斜程度与表的膨胀大小成正比)。然后小表再和这个中间表进行LEFT JOIN,这样操作的效果等于小表LEFT JOIN大表。
b、关联的两个表都比较大。
首先考虑去重。其次考虑将热点数据分开处理:先将主表热点Key取出,再用热点Key切分成热点数据和非热点数据两部分分别处理,最后合并。
- JOIN Key存在很多空值导致长尾:此时可以将空值处理成随机值。因为空值无法关联上,只是分发到了一处,因此给予随机值既不会影响关联也能避免聚集。
假设a表的id存在很多空值,那么我们在关联的时候可以将关联条件转化。见下:
on a.id = b.id
--转化为
on coalesce(a.id,rand()*9999) = b.id
sql数据处理的长尾问题及优化相关推荐
- SQL Server 2016 查询存储性能优化小结
SQL Server 2016已经发布了有半年多,相信还有很多小伙伴还没有开始使用,今天我们来谈谈SQL Server 2016 查询存储性能优化,希望大家能够喜欢 作为一个DBA,排除SQL Ser ...
- 如何对大量长尾关键词进行优化?
在网站优化中,为了能够降低核心关键词的竞争力,通常都会采取长尾关键词优化来帮助网站提升排名和权重,对于用户体验也有一定的提升.因此网站做好长尾关键词的优化也非常重要,但网站关键词的筛选.布局等也都是有 ...
- 腾讯基于 Flink SQL 的功能扩展与深度优化实践
简介:本文由腾讯高级工程师杜立分享,主要介绍腾讯实时计算平台针对 Flink SQL 所做的优化. 整理:戴季国(Flink 社区志愿者) 校对:苗文婷(Flink 社区志愿者) 摘要:本文由腾讯高级 ...
- SQL server 系统优化--通过执行计划优化索引(1) (转)
SQL server 系统优化--通过执行计划优化索引(1) 前几天,远离上海,到了温州,在客户的这边处理系统慢,该系统每天正常down机7次左右,在线人员一多,系统运行缓慢,严重影响业务操作,到了无 ...
- 堆积密度怎么做_长尾关键词怎么优化?这样布局关键词排名效率高
上一篇我们谈到了长尾关键词的挖掘,今天我们来谈谈长尾关键词如何优化的问题,如果还不知道怎么挖掘长尾关键词的可以通过传送门(什么是长尾关键词,长尾关键词如何挖掘?)进行了解. 长尾关键词的优化可以有效提 ...
- oracle 最大值及其_学习笔记:Oracle优化 SQL查询最大值 最小值时的优化方法案例...
天萃荷净 select max(id),min(id) from table优化,分享开发DBA需求,在SQL语句查询最大值.最小值数据时的优化方式案例 1.查看数据库版本 SQL> selec ...
- sql declare用法_SQL语句的优化分析
一.开门见山,问题所在 sql语句性能达不到你的要求,执行效率让你忍无可忍,一般会时下面几种情况. 网速不给力,不稳定. 服务器内存不够,或者SQL 被分配的内存不够. sql语句设计不合理 没有相应 ...
- 长尾关键词排名优化技巧
长尾关键词该如何优化,通过关键词SEO排名提升网站流量转换是我们网站SEO的目标,而打造关键词优化是我们SEO的基础.很多情况下我们在 SEO时更多的关注是如何优化我们的关键词. 关键词SEO排名分析 ...
- php多表查询性能优化,MSSQL_SQL Server多表查询优化方案集锦,SQL Server多表查询的优化方案是 - phpStudy...
SQL Server多表查询优化方案集锦 SQL Server多表查询的优化方案是本文我们主要要介绍的内容,本文我们给出了优化方案和具体的优化实例,接下来就让我们一起来了解一下这部分内容. 1.执行路 ...
最新文章
- 基于vue的公共looploading组件(vue循环加载--组件)
- hdu 1005 1021 递归超限 找规律 // 只要看题中n较大都是有规律的
- iOS开发-项目的完整重命名方法,图文教程。
- another app is currently hold yum lock问题
- Android Studio签名打包的两种方式
- Spring Boot中文乱码问题怎么解决(按步骤做)
- Miniconda3及pip换源(conda清华源关闭)
- Vs code自动生成Doxygen格式注释
- 搭建基于云端的中间层以支持跨平台的智能视觉服务
- 论坛头条内容链接地址有误
- 推荐系统-Task05推荐系统流程构建
- 编译安装dropbear
- perf-应用程序的调优与使用
- Linux总结篇 linux命令 虚拟机 - (二)
- 计算机管理-共享打印,打印机局域网共享怎么设置?最简单稳定的方法:一键共享...
- 免费好用的虚拟服务器,六大免费好用的虚拟主机管理系统
- CST STUDIO SUITE 2022 软件下载与安装教程
- 谷歌浏览器如何正确安装第三方已被停用的扩展插件
- 面对职场“毕业”,PMPMO应该如何从容的应对?如何跳槽能够大幅度升职加薪?【大海午餐】
- 20190401每周精品之理财