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中对某些情况的查询不 ...
随机推荐
- 【Linux】一步一步学Linux——Linux版本(03)
目录 00. 目录 01. Linux内核版本 02. Linux内核官方网站 03. Linux发行版本 04. Linux发行版本介绍 4.1 Ubuntu 4.2 RedHat 4.3 Debi ...
- ALV报表——ALV颜色设置(三)
目录 一.行 二.列 三.单元格 四.附ALV的颜色代码 一.行:用Layout相关属性设置 代码: *Report ZRFI001_XFL_TEST REPORT ZRFI001_XFL_TEST ...
- Jmeter之分布式测试/压测
Jmeter做分布式测试的原因: 测试机器的配置低,对服务器进行压测时,造成不了压力. jmeter并发10000后,测试机就已经卡顿了,而且测试结果有大量失败(忽略了jmeter自身问题=.=||| ...
- window服务器查看管理员列表
快捷键win+R 输入cmd并进入 输入指令net localgroup administrators
- 设计基于HTML5的APP登录功能及安全调用接口的方式(原理篇)
登录 保存密码 安全 加密 最近发现群内大伙对用Hbuilder做的APP怎么做登录功能以及维护登录状态非常困惑,而我前一段时间正好稍微研究了一下,所以把我知道的告诉大家,节约大家查找资料的时间. 你 ...
- Gogs搭建私有git代码仓库
前置环境: 数据库 -> mysql git -> 服务端和客户端版本必须>=1.8.3 ssh服务 -> 如果只使用http/https方式的话,服务端无需配置ssh. st ...
- Asp.net Report动态生成
rdlc报表实质上是一个xml文件,如果要实现动态报表,就需要动态生成rdlc文件,实质上就是读写xml文件: protected XmlDocument GenerationAddReportCol ...
- Python中函数的知识点
1.函数的定义与调用 2.函数的参数 3.函数的返回值 1. 1.1.函数的定义: 函数是组织好的,可重复使用的,用来实现单一,或相关联功能的代码段. 1.2.定义一个函数: 规则: 函数代码块以 ...
- 【转】HTTP响应状态码参考簿
HTTP响应状态码参考簿 http状态返回代码 1xx(临时响应)表示临时响应并需要请求者继续执行操作的状态代码. http状态返回代码 代码 说明100 (继续) 请求者应当继续提出请求. ...
- python简单页面爬虫入门 BeautifulSoup实现
本文可快速搭建爬虫环境,并实现简单页面解析 1.安装 python 下载地址:https://www.python.org/downloads/ 选择对应版本,常用版本有2.7.3.4 安装后,将安装 ...