Greenplum 调优--数据分布法则 - 分布列与分区的选择
分布列选择黄金法则
由于Greenplum是一个分布式的数据库,数据是分散存储在各个数据节点的,所以需要告诉Greenplum数据应该如何分布。
短板效应
当用户请求QUERY时,Greenplum会在所有的节点并行执行,所以最慢的节点会成为整个系统的瓶颈。
Greenplum 支持的分布算法 :
用户可以指定 分布列(允许指定多个列) ,或者使用 随机分布 算法。
那么用户应该如何选择分布列,或者是否要使用随机分布算法呢?
总结起来,需要考虑以下几点
JOIN
当JOIN的列都是分布列时,不需要重分布或广播小表,可以在segment内完成JOIN。
两个表在JOIN时,如果JOIN列不是表的分布列,那么其中一个更小的表会发生数据重分布,或者broadcast,以继续完成JOIN的动作。
例如a和b都是随机分布的,在JOIN时,要么广播小表,要么两个表都根据JOIN 列重分布。
例如a和b,其中a是JOIN列分布,b不是,那么b可以选择广播,或者重分布。
重分布或广播的动作都是自动完成的,但是这样一定会带来额外的网络开销。
想象一下,如果你的QUERY并发很高,而且大量的QUERY中涉及到JOIN的数据重分布或broadcast的话,网络很快就会成为瓶颈。
法则1,分布列尽量选择需要经常JOIN的列,这类查询的并发越高,越应该考虑。
防止数据倾斜
Greenplum依据指定的分布列,hash取模存放到对应的segment中。
如果选择的分布列值分布不均匀,就可能导致数据倾斜,某些segment可能非常大,而某些segment非常小。
数据倾斜的显著危害,1. 空间不均匀,不好规划存储。2. 数据分布过多的节点,容易成为整个系统的短板。
法则2,尽量选择分布均匀的列,或者多列
高并发查询,选择性好
如果数据经常被高并发的键值或离散查询,建议将查询条件的列作为分布列,这样不需要连接到所有的segment去查,可以大大提高并发能力。
例子
aa01 的分布列是aaz499
查询分布列时,定位到一个segment查询
postgres=# explain analyze select * from aa01 where aaz499=1;
QUERY PLAN
----------------------------------------------------------------------------------
Gather Motion 1:1 (slice1; segments: 1) (cost=0.00..120.00 rows=1 width=1973)
Rows out: 0 rows at destination with 1.352 ms to end, start offset by 144 ms.
-> Seq Scan on aa01 (cost=0.00..120.00 rows=1 width=1973)
Filter: aaz499 = 1
Rows out: 0 rows with 0.031 ms to end, start offset by 145 ms.
Slice statistics:
(slice0) Executor memory: 330K bytes.
(slice1) Executor memory: 176K bytes (seg10).
Statement statistics:
Memory used: 128000K bytes
Optimizer status: legacy query optimizer
Total runtime: 145.822 ms
(12 rows)
查询非分布列,需要所有的segment参与查询
postgres=# explain analyze select * from aa01 where cae007='t';
QUERY PLAN
------------------------------------------------------------------------------------
Gather Motion 16:1 (slice1; segments: 16) (cost=0.00..120.00 rows=2 width=1973)
Rows out: 0 rows at destination with 2.001 ms to end, start offset by 146 ms.
-> Seq Scan on aa01 (cost=0.00..120.00 rows=1 width=1973)
Filter: cae007::text = 't'::text
Rows out: 0 rows (seg0) with 0.047 ms to end, start offset by 147 ms.
Slice statistics:
(slice0) Executor memory: 330K bytes.
(slice1) Executor memory: 176K bytes avg x 16 workers, 176K bytes max (seg0).
Statement statistics:
Memory used: 128000K bytes
Optimizer status: legacy query optimizer
Total runtime: 147.813 ms
(12 rows)
法则3,尽量选择高并发查询的条件列(指该查询条件产生的中间结果集小的,如果中间结果集很大,那就让所有节点都来参与运算更好,因此不选),如果有多个条件,请先权衡前面的法则
法则4,不要轻易使用随机分布
分区黄金法则
目前Greenplum支持LIST和RANGE两种分区类型。
分区的目的是尽可能的缩小QUERY需要扫描的数据量,因此必须和查询条件相关联。
法则1,尽量选择和查询条件相关的字段,缩小QUERY需要扫描的数据
法则2,当有多个查询条件时,可以使用子分区,进一步缩小需要扫描的数据
例子,一个用户发起了带两个查询条件col1=xx and col2 between ?1 and ?2 的请求,通过分区,如果表已经根据col1进行了LIST分区,同时根据col2进行了range的分区,那么查询范围可以大大的缩小。
小结
分布列选择法则
原则,避免短板效应。
法则1,分布列尽量选择需要经常JOIN的列,这类查询的并发越高,越应该考虑。
法则2,尽量选择分布均匀的列,或者多列
法则3,尽量选择高并发查询的条件列(指该查询条件产生的中间结果集小的,如果中间结果集很大,那就让所有节点都来参与运算更好,因此不选),如果有多个条件,请先权衡前面的法则
法则4,不要轻易使用随机分布
分区法则
原则,缩小查询范围。
法则1,尽量选择和查询条件相关的字段,缩小QUERY需要扫描的数据
法则2,当有多个查询条件时,可以使用子分区,进一步缩小需要扫描的数据
转载自:
https://github.com/zuozi2810/blog/blob/master/201607/20160719_02.md
Greenplum 调优--数据分布法则 - 分布列与分区的选择的更多相关文章
- Greenplum 调优--数据倾斜排查(一)
对于分布式数据库来说,QUERY的运行效率取决于最慢的那个节点. 当数据出现倾斜时,某些节点的运算量可能比其他节点大.除了带来运行慢的问题,还有其他的问题,例如导致OOM,或者DISK FULL等问题 ...
- Greenplum 调优--VACUUM系统表
Greenplum 调优--VACUUM系统表 1.VACUUM系统表原因 Greenplum是基于MVCC版本控制的,所有的delete并没有删除数据,而是将这一行数据标记为删除, 而且update ...
- Greenplum 调优--数据倾斜排查(二)
上次有个朋友咨询我一个GP数据倾斜的问题,他说查看gp_toolkit.gp_skew_coefficients表时花费了20-30分钟左右才出来结果,后来指导他分析原因并给出其他方案来查看数据倾斜. ...
- Greenplum 调优--查看子节点SQL运行状态
摘自<Greenplum企业应用实战> 重点: 使用gp_dist_random函数,将查询下发到每个Segement 创建查看子节点SQL运行状态视图 1)创建v_active_sql视 ...
- SQL Server 列存储性能调优(翻译)
原文地址:http://social.technet.microsoft.com/wiki/contents/articles/4995.sql-server-columnstore-performa ...
- OCM_第十三天课程:Section6 —》数据库性能调优 _结果缓存 /多列数据信息采集统计/采集数据信息保持游标有效
注:本文为原著(其内容来自 腾科教育培训课堂).阅读本文注意事项如下: 1:所有文章的转载请标注本文出处. 2:本文非本人不得用于商业用途.违者将承当相应法律责任. 3:该系列文章目录列表: 一:&l ...
- 分布式 PostgreSQL 集群(Citus),分布式表中的分布列选择最佳实践
确定应用程序类型 在 Citus 集群上运行高效查询要求数据在机器之间正确分布.这因应用程序类型及其查询模式而异. 大致上有两种应用程序在 Citus 上运行良好.数据建模的第一步是确定哪些应用程序类 ...
- 【Hive】Hive笔记:Hive调优总结——数据倾斜,join表连接优化
数据倾斜即为数据在节点上分布不均,是常见的优化过程中常见的需要解决的问题.常见的Hive调优的方法:列剪裁.Map Join操作. Group By操作.合并小文件. 一.表现 1.任务进度长度为99 ...
- 【Hadoop离线基础总结】Hive调优手段
Hive调优手段 最常用的调优手段 Fetch抓取 MapJoin 分区裁剪 列裁剪 控制map个数以及reduce个数 JVM重用 数据压缩 Fetch的抓取 出现原因 Hive中对某些情况的查询不 ...
随机推荐
- 【dfs】Sequence Decoding
Sequence Decoding 题目描述 The amino acids in proteins are classified into two types of elements, hydrop ...
- PB笔记之数据窗体分组合计列
- hdu 2539 虽然是水题 wa了很多次 说明自己的基本功不扎实 需要打好基础先 少年
两点吧 1.gets使用的时候 确保上一次的回车符对其没有影响 getline也是如此 这样的细节.. 多注意啊!! 2.编写程序的时候 对一些极端的情况要多调试 比如此题当 n==1的时候.. ...
- Mac Book触摸板失灵的解决办法(触摸板按下失灵)
1. 先关机 2. 同时按住 command+option+R+P 3. 按电源键开机,同时手指保持按住前几个按钮的姿势. 4. 等待电脑发出四下“deng”的声音后松开即可.每次发声间隔大概6~7秒 ...
- 海量数据处理的 Top K 相关问题
Top-k的最小堆解决方法 问题描述:有N(N>>10000)个整数,求出其中的前K个最大的数.(称作Top k或者Top 10) 问题分析:由于(1)输入的大量数据:(2)只要前K个,对 ...
- kvm第四章-- 虚拟化网络管理
- ElementUI对话框(dialog)提取为子组件
需求:在页面的代码太多,想把弹窗代码提取为子组件,复用也方便. 这里涉及到弹窗el-dialog的一个属性show-close: show-close="false"是设置不显 ...
- 1+X证书学习日志——盒模型
## padding的作用: 控制子元素和父元素之间的位置关系 padding设置方法: ...
- MM-发票校验与收货的差异处理
SAP FI-财务发票校验修改金额后没有进入差异科目问题:公司新建物料采购订单,在MM科目自动确定配置完成后,做发票校验时,修改金额没修改数量时,差异进入了原材料科目 换采购订单继续测试时,修改金额没 ...
- 30分钟用Restful ABAP Programming模型开发一个支持增删改查的Fiori应用
2016年时,Jerry曾经写过一系列关于SAP Fiori Smart Template(现在更名为Fiori Elements了)的博客,介绍了所谓的MDD开发方法论 - Metadata Dri ...