分布列选择黄金法则

由于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

转载于:https://www.cnblogs.com/xibuhaohao/p/11133145.html

Greenplum 调优--数据分布法则 - 分布列与分区的选择相关推荐

  1. 分布式 PostgreSQL 集群(Citus),分布式表中的分布列选择最佳实践

    确定应用程序类型 在 Citus 集群上运行高效查询要求数据在机器之间正确分布.这因应用程序类型及其查询模式而异. 大致上有两种应用程序在 Citus 上运行良好.数据建模的第一步是确定哪些应用程序类 ...

  2. MySQL——数据库调优整体策略

    文章目录 MySQL--数据库调优整体策略 1.数据库调优 1.1.调优的目标 1.2.确定调优的目标 1.3.调优的维度和步骤 2.MySQL服务器的优化 2.1.优化服务器硬件 2.2.优化MyS ...

  3. kylin调优,项目中错误总结,知识点总结,kylin jdbc driver + 数据库连接池druid + Mybatis项目中的整合,shell脚本执行kylin restapi 案例

    关于本篇文章的说明: 本篇文章为笔者辛苦劳作用了一整天总结出来的文档,大家阅读转发的时候请不要吝啬写上笔者:涂作权 和 原文地址. 由于笔者所在环境没有人用过kylin,笔者也是自学官网,阅读书籍 将 ...

  4. JVM下篇:性能监控与调优篇

    1. 概述篇 1.1. 大厂面试题 支付宝: 支付宝三面:JVM 性能调优都做了什么? 小米: 有做过 JVM 内存优化吗? 从 SQL.JVM.架构.数据库四个方面讲讲优化思路 蚂蚁金服: JVM ...

  5. kylin调优,项目中错误总结,知识点总结,kylin jdbc driver + 数据库连接池druid + Myba

    首先给大家分享一个巨牛巨牛的人工智能教程,是我无意中发现的.教程不仅零基础,通俗易懂,而且非常风趣幽默,还时不时有内涵段子,像看小说一样,哈哈-我正在学习中,觉得太牛了,所以分享给大家!点这里可以跳转 ...

  6. JVM系列之故障排查与性能调优(重点)

    1.故障排查与性能调优 1.1.概述 1.1.1.生产环境中的问题? 生产环境发生了OOM,该如何处理?如何判断是否是内存泄漏导致的? 生产环境应该给Java进程分配多少内存? 生产环境应该如何选择垃 ...

  7. Hadoop性能调优概要说明

    Hadoop容易遇到的问题有:Namenode/jobtracker单点故障.HDFS小文件问题.数据处理性能等.为此 "Hadoop Performance Optimization&qu ...

  8. 【Elasticsearch】Elasticsearch性能调优

    1.概述 转载:Elasticsearch性能调优 因为总是看到很多同学在说elasticsearch性能不够好,集群不够稳定,询问关于elasticsearch的调优,但是每次都是一个个点的单独讲, ...

  9. CTO 说公司的 ES 性能不够好、集群不够稳定!直到我用了这些调优技巧后。。。...

    点击上方"芋道源码",选择"设为星标" 管她前浪,还是后浪? 能浪的浪,才是好浪! 每天 8:55 更新文章,每天掉亿点点头发... 源码精品专栏 原创 | J ...

最新文章

  1. golang 判断目录是否为空
  2. 1131 Subway Map (30 分)【难度: 难 / Dijkstra最短路】
  3. c php数据,C 数据类型
  4. 初一模拟赛总结(5.11)
  5. Jmeter系列之接口依赖
  6. python接口自动化(三十二)--Python发送邮件(常见四种邮件内容)番外篇——上
  7. 基于libpcan库can总线操作的Barrett 机械手控制及腕部六维力传感器驱动
  8. 4创建ui显示不出来_4道小学生经典推理题,家长们一道也做不出来,太烧脑了...
  9. java导出地图矢量Shp文件
  10. 看咪蒙真的有那么low吗?
  11. 市场调查报告写作的基本要求
  12. 静态路由只配置出接口网络不通(实验)
  13. OpenAi ChatGPT注册及使用教程
  14. 叶俊:领袖需要思考的问题
  15. f452虚拟服务器,F460 F452 获取超级密码 解决 LOID 注册断线 保留telnet 无需ttl 不用拔光纤...
  16. 推特错误,呃,出错了,请稍后重试
  17. Java高级架构师之路核心知识整理
  18. SaaS云服务应用的访问安全性分析
  19. 从零开始研发GPS接收机连载——8、跟踪调试之遇到瓶颈
  20. 【小程序】滚动的公告栏

热门文章

  1. 量化投资必备手册:史上超全量化交易平台汇总
  2. 永远不要使用 Boolean 对象
  3. 使用IntelliJ IDEA 配置Maven(入门)
  4. 如何将pdf中一些特定页提取存储在另一个pdf中
  5. python学生姓名添加删除_python-函数-实现学生管理系统,完成对学员的增,删,改,查和退出学生管理系统。...
  6. payssion支付
  7. Failed to execute goal on project basic-core-data: Could not resolve dependencies for project ct com
  8. P205-下载xkcd漫画
  9. D. Serval and Rooted Tree
  10. 关于svn提交performing vcs refresh 卡住的解决办法